AMKeyboardFrameTracker
用于自定义交互式键盘退出的简单 iOS 键盘框架追踪器
功能
- 非常简单易用的 API
- 提供代理和闭包回调
- 可用于任何类型的输入视图(
UITextField
、UITextView
) - 允许在带有
inputAccessoryView
的UITabBarController
中进行交互式键盘弹出
示例
要运行示例项目,请克隆仓库,然后运行 .xcworkspace。
安装
AMKeyboardFrameTracker 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile
pod 'AMKeyboardFrameTracker'
需求
- 支持iOS 9.0+
用法
let height = 60 // this should be your input view height
let keyboardFrameTrackerView = AMKeyboardFrameTrackerView.init(height: height)
inputTextView.inputAccessoryView = keyboardFrameTrackerView
注意
如果你的inputView
的高度是动态变化的,取决于其内部的内容,那么你将需要保持inputAccessoryView
的高度与inputView
的高度同步,为此你需要覆写你ViewController中的viewDidLayoutSubviews
方法并使用下面的代码
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.keyboardFrameTrackerView.setHeight(self.inputContainerView.frame.height)
}
或者你可以使用布局约束
var keyboardFrameTrackerViewHeightConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
self.keyboardFrameTrackerView.delegate = self
self.inputTextView.inputAccessoryView = self.keyboardFrameTrackerView
self.keyboardFrameTrackerView.translatesAutoresizingMaskIntoConstraints = false
self.keyboardFrameTrackerViewHeightConstraint = self.keyboardFrameTrackerView.heightAnchor.constraint(equalTo: self.inputTextView.heightAnchor, multiplier: 0)
self.keyboardFrameTrackerViewHeightConstraint.isActive = true
}
然后在viewDidLayoutSubviews
中更新这个常量
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.keyboardFrameTrackerViewHeightConstraint.constant = self.inputTextView.frame.height
}
闭包回调
keyboardFrameTrackerView.onKeyboardFrameDidChange = { [weak self] frame in
guard let self = self else {return}
print("Keyboard frame: ", frame)
}
委托回调
keyboardFrameTrackerView.delegate = self
extension ExampleViewController: AMKeyboardFrameTrackerDelegate {
func keyboardFrameDidChange(with frame: CGRect) {
print("Keyboard frame: ", frame)
}
}
UITabBarController支持
首先,你需要将你的inputView
添加到ViewController的view作为一个普通的子视图,然后设置所有你的约束和布局,你需要从inputView
到ViewController的view的底部约束,并使用下面的代码
extension ExampleViewController: AMKeyboardFrameTrackerDelegate {
func keyboardFrameDidChange(with frame: CGRect) {
let tabBarHeight = self.tabBarController?.tabBar.frame.height ?? 0.0
let bottomSapcing = self.view.frame.height - frame.origin.y - tabBarHeight - self.keyboardFrameTrackerView.frame.height
self.inputViewBottomConstraint.constant = bottomSapcing > 0 ? bottomSapcing : 0
self.view.layoutIfNeeded()
}
}
作者
许可
AMKeyboardFrameTracker 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。