大部分应用都有要求用户键入数据的场景,如果开发者不做特别处理,弹起的键盘会遮住位于界面底部输入框(UITextField/UITextView),为了更好的用户体验,开发者需要去解决这个问题。
注:如果输入框所在的控制器继承自UITableViewController,由于UITableViewController已经内在地相应并处理了键盘事件,当用户准备输入时,UITableView会向上滚动直到输入框出现在键盘上方,自动解决了键盘遮住输入框的问题。
采用第三库是一种解决问题的思路,这种办法对已有项目侵入性较强,未知风险大,而如果在应用内,仅有一处键盘遮住输入框,此时引用笨重的第三种有点得不偿失,这就需要开发者手动地自己处理这个问题。
具体思路如下:
1. 注册键盘相应监听事件。
注册事件在控制器或视图出现后,如viewDidAppear中,在viewWillAppear中会出现不必要的重复注册,Swift代码如下:
//注册监听键盘出现事件
NSNotificationCenter.defaultCenter().addObserver(self,selector:#selector(keyboardWillShow), name:UIKeyboardWillShowNotification, object:nil)
//注册监听键盘消失事件
NSNotificationCenter.defaultCenter().addObserver(self,selector:#selector(keyboardWillHide), name:UIKeyboardWillHideNotification, object:nil)
2. 通过捕捉通知消息里的键盘高度,调整视图位置到键盘以上。当键盘消失时,视图调整到原来位置。
//调整视图位置
let userInfo = notification.userInfo!
let keyboardSize
= userInfo[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue().size
//也可获取键盘动画持续的事件,如果调整视图动画时间保持一致让体验更好
let animationDuration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSValue as! NSTimeInterval
UIView.animateWithDuration(animationDuration, delay:0, options:UIViewAnimationOptions.init(rawValue: animationCurve), animations: {
// TODO: 手动设置视图坐标大小等
//键盘高度 keyboardSize.height
}, completion:nil)
//记得在方法keyboardWillHide内恢复视图位置
如果输入框在UITableView或UIScrollView,可以通过设置contentOffset调整父视图状态。
3. 注销键盘响应监听事件。
注销事件在控制器或视图消失时,如viewWillDisappear中。Swift代码如下:
//注销上面注册的事件监听器
NSNotificationCenter.defaultCenter().removeObserver(self,name:UIKeyboardWillShowNotification, object:nil)
NSNotificationCenter.defaultCenter().removeObserver(self,name:UIKeyboardWillHideNotification, object:nil)
最后有了清晰的思路,后面就是Coding!
推荐阅读:
更多
获取更多内容请关注微信公众号豆志昂扬:
+ 直接添加公众号豆志昂扬;
+ 微信扫描下图二维码;
网友评论