lufei's Studio.

iOS 关于键盘

字数统计: 739阅读时长: 2 min
2020/06/04 Share

前言

iOS 上多个输入框,可能出现的键盘遮挡,始终是一个有一丢丢麻烦的问题,当然,有很好的第三方 IQKeyboardManager,帮助我们一行代码解决了这个问题,不过,我还是想自不量力的做一些小小的总结。

iOS 键盘的基本知识

在 iOS 上,键盘的变化由 NSNotificationCenter 控制的,所以要想拿到这些关于键盘的变化信息,你得提前在 NSNotificationCenter 上添加观察者,来监听这些关于键盘的通知。

那么具体有哪些通知呢?比如下面这些吧:

keyboardWillChangeFrameNotification: 在键盘 frame 更改之前立即发出

keyboardWillShowNotification: 在键盘出现之前立即发出

当然还有其他的,就不一一列举了~

除了键盘的通知,通知的内容,也是我们需要关注的,这些信息都保存在 NSNotificationuserInfo 字典中,我们可以通过一些特殊的 key 来获取,比如:

keyboardFrameBeginUserInfoKey:返回开始时键盘在当前屏幕中的 frame

那么我们可以这样获取 rect

1
2
let noti = NSNotification()
let rect = noti.userInfo?[UIResponder.keyboardIsLocalUserInfoKey] as? CGRect

除了键盘本身的这些通知,还有一些关于和输入框相关的通知 UITextFieldTextDidBeginEditingNotification 等等,这些使用方法和上面类似

键盘遮挡解决方案

可以看出来,无论是什么关于键盘遮挡的方案,一定是基于通知的。

大名鼎鼎的 IQKeyboardManager 也是这么做的

通过参考 IQKeyboardManager 的源码,键盘遮挡解决方案大概是这样:

  • 首先,设计一个类,遵循单例模式,注册并监听键盘相关的通知

  • 初始化一个 UITapGestureRecognizer,在点击 UITextField 对应的 UIWindow 的时候,收起键盘

  • 初始化一些默认属性,例如键盘距离、覆写键盘的样式等

  • 设置不需要解决键盘遮挡问题的类

  • 其他

基本上,整个解决方案其实都是基于 iOS 中的通知系统的;在事件发生时,调用对应的方法做出响应。

举个例子( IQKeyboardManager 源码理解)

比如一个 UITextField 被点击的时候,textFieldViewDidBeginEditing(这个方法只是和代理方法同名) 被调用,然后在这个方法中,做了这样几件事:

其中由两个比较重要的方法:

以上大概就是 IQKeyboardManager 的关键内容了

小结

当然 IQKeyboardManager 的内容肯定不止这些,比如 UITextField 和 UITextView 的通知机制,IQToolBar 的实现,IQTextView 的实现啊等等,欢迎大家还是去读源码(也是在跟自己说哒~)

参考

IQKeyboardManager

『零行代码』解决键盘遮挡问题(iOS)

CATALOG
  1. 1. 前言
  2. 2. iOS 键盘的基本知识
  3. 3. 键盘遮挡解决方案
  4. 4. 举个例子( IQKeyboardManager 源码理解)
  5. 5. 小结
  6. 6. 参考