IQKeyboardManager 三步走
大家都用 IQKeyboardManager,
IQKeyboardManager 引入,就管理好了
第 1 步,注册系统通知,获得键盘事件
从键盘事件中,得到输入文本框对象, UITextField / UITextView 的实例
IQKeyboardManager 初始化的时候,就完成了这些
第 2 步,计算出当前文本框的位置, 并移动
有了文本框,要找到他当前的位置,frame
就要从文本框溯源,找到他的根视图控制器
然后计算出当前文本框在哪个位置合适,
移动过去,就好了
2.1 , 计算出合适的位置
先算出,该文本框在根视图的位置
再算出,该文本框在当前窗口, KeyWindow, 中的合适位置
2.2,键盘出现,与键盘消失
开始编辑,键盘出现,移动位置
结束编辑,键盘消失,还原位置
3,情况判断
UIView 上放置几个 UITextField / UITextView ,好处理
UIView 上放置 UITableView, UITableView 上的一个 cell,上面摆放 UITextField / UITextView,就复杂了一些
3.1 特殊类处理,
对于 UIAlertController 的输入框,不用处理
比较特殊的,还有 UITableViewController、UISearchBar、
_UIAlertControllerTextFieldViewController
0, 键盘管理,很简单
对于一个输入框 UITextField , 放置在 UIView 上,
键盘出来了,这个 UITextField 的位置,要适当,
通过两个通知处理掉,
一般情况下,键盘出来,把 UITextField 位置放高一点,
键盘消失,把 UITextField 位置放回原处
import SnapKit
// 注册通知
func config(){
NotificationCenter.default.addObserver(self,
selector: #selector(self.keyboardWillShow(noti:)),
name: UIWindow.keyboardWillShowNotification,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(self.keyboardWillHide(noti:)),
name: UIWindow.keyboardWillHideNotification,
object: nil)
}
// 放高一点
@objc
func keyboardWillShow(noti notification: NSNotification){
yConstraint?.constraint.update(offset: s.height * (-0.5))
layoutIfNeeded()
}
// 放回原处
@objc
func keyboardWillHide(noti notification: NSNotification){
yConstraint?.constraint.update(offset: 0)
layoutIfNeeded()
}
对于 UITextView,也这样处理
IQKeyboardManager 做的工作,就复杂、全面了很多
1, 初始化工作
注册 4 个键盘通知,
键盘将要出现,键盘出现了,
键盘将要消失,键盘消失了,
输入文本框,有两种,UITextField 和 UITextView
再注册两个 UITextField 的通知,两个 UITextView 的通知
最后注册一个屏幕旋转的通知
@objc func registerAllNotifications() {
// Registering for keyboard notification.
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil)