1、业务场景
类似于QQ、微信的聊天框,当开始输入文字时我们会发现:
- 输入框(
UITextField
)下边界紧贴键盘上边界 - 消息界面(
UITableView
)最上面的几条聊天记录滑出视线
怎么做到的呢?
2、实现方法
最重要的一条是要拿到键盘的高度,可以这样实现:
- 先在ViewController中注册通知
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
- 通过notification对象拿到键盘高度
@objc func keyboardWillAppear(notification: NSNotification) {
let keyboardinfo = notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey]
let keyboardheight: CGFloat = (keyboardinfo as AnyObject).cgRectValue.size.height
//如果输入框在安全区之上,要减去这部分的偏移
print(keyboardheight - view.safeAreaInsets.bottom)
}
Attention
不要用keyboardFrameBeginUserInfoKey
,否则会返回两种高度,这跟键盘的prediction bar
有关。
-
更新约束
(1)
UITextField
可以通过updateConstraints
更新边界约束(2)
UITableView
可以通过改变setContentOffset
方法,一般情况下当键盘出现时,想让了聊天记录向上滑,只需要增加y坐标即可 -
当编辑完毕后隐藏键盘并重置约束
//实现UITextFieldDelegate方法监听输入状态
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
/**
//重置约束,与第三步相反即可
*/
return true
}