1.注册/移除通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillShow(_:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillHide(_:)), name:NSNotification.Name.UIKeyboardWillHide, object: nil)
}
deinit {
//移除通知
NotificationCenter.default.removeObserver(self)
}
2.实现通知的方法:
//键盘的出现
func keyBoardWillShow(_notification: Notification){
//获取userInfo
let kbInfo = notification.userInfo
//获取键盘的size
let kbRect =(kbInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
//键盘的y偏移量
let changeY = kbRect.origin.y -SCREEN_HEIGHT
//键盘弹出的时间
let duration =kbInfo?[UIKeyboardAnimationDurationUserInfoKey] as!Double
//界面偏移动画
UIView.animate(withDuration: duration) {
self.aTableView.transform= CGAffineTransform(translationX: 0, y:changeY)
}
}
//键盘的隐藏
func keyBoardWillHide(_notification: Notification){
let kbInfo = notification.userInfo
let kbRect =(kbInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
/*
* let kbRect = (userInfo![UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue
* swift2.3正常,swift3.0取值为nil
*/
let changeY = kbRect.origin.y
let duration =kbInfo?[UIKeyboardAnimationDurationUserInfoKey] as!Double
UIView.animate(withDuration: duration) {
self.tableViewConstraint.update(inset:0)
}
}
思路整理:
1.view消失,检查frame的origin
2.第一思路:closure没有捕获变量;错误
第二思路:notification.userInfo有值;有UIKeyboardFrameEndUserInfoKey键,有value;
查看新的取值方法。