美文网首页
IQKeyboardManagerSwift 源码阅读

IQKeyboardManagerSwift 源码阅读

作者: Tony17 | 来源:发表于2020-03-12 21:18 被阅读0次

前言

IQKeyboardManager 这个库在 OC 项目中运用非常广泛,它让我们从键盘遮挡输入框的泥沼中解脱出来,而且它还提供很强大的ToolBar功能。它的具体使用方法这里就不做详细介绍了,感兴趣的同学可以到项目的github主页自行查看。IQKeyboardManagerSwift 和 IQKeyboardManager 是在一个git项目下的,实现逻辑也是保持了高度统一,OC 的 IQKeyboardManager 项目之前没有看过怎么实现的,今天来看一下 IQKeyboardManagerSwift 的实现步骤。

实现步骤

其实这个库的基本实现步骤和我们自己写的时候并没有区别,也是通过通知监听 UITextField 和 UITextView 的编辑状态以及键盘的状态。当然作为三方库,少不了还要支持屏幕旋转的情况啦。大致代码如下:

        //  Registering for keyboard notification.
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(_:)), name: UIKeyboardDidShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIKeyboardWillHide, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidHide(_:)), name: UIKeyboardDidHide, object: nil)
        
        //  Registering for UITextField notification.
        registerTextFieldViewClass(UITextField.self, didBeginEditingNotificationName: UITextFieldTextDidBeginEditing.rawValue, didEndEditingNotificationName: UITextFieldTextDidEndEditing.rawValue)
        
        //  Registering for UITextView notification.
        registerTextFieldViewClass(UITextView.self, didBeginEditingNotificationName: UITextViewTextDidBeginEditing.rawValue, didEndEditingNotificationName: UITextViewTextDidEndEditing.rawValue)
        
        //  Registering for orientation changes notification
        NotificationCenter.default.addObserver(self, selector: #selector(self.willChangeStatusBarOrientation(_:)), name: UIApplicationWillChangeStatusBarOrientation, object: UIApplication.shared)

这里监听 UITextField 和 UITextView 的编辑状态,除了防止出现意外情况之外,还有个原因是为了设置 ToolBar,ToolBar主要是有上下输入框切换,显示输入框提示信息和隐藏键盘的按钮。隐藏键盘和输入框提示信息这个没有什么技术难点,主要是上下输入框切换这里我们接触的相对来说要少一些,而这个功能对于一个页面有多个输入框甚至很多输入框(例如提交表单等)的情况来说就非常实用了。这里在判断是否要现实上下切换按钮的时候,是会去获取和当前输入框同级别的所有可以用来切换的输入框,返回输入框列表的时候会先根据切换规则的配置来进行排序。这样我们在点击的切换输入框的时候就可以按照我们希望的那样去切换。

当键盘会遮挡输入框的时候,需要把输入框移动到键盘上方,这里的做法是判断当前输入框是否在一个 UIScrollView 中,如果在 UIScrollView 中的话,就通过改变 scrollIndicatorInsets 和 contentInset 属性值来达到输入框上移的目的。但是如果有多个 UIScrollView的话,可能会出现一些奇怪的现实效果,为了避免这个问题,这个库的操作方式是找到最外层的 UIScrollView 来进行操作。这样看上去是不会很突兀了。但是有些页面是输入框是没有在 UIScrollView 中或者没有 UIScrollView 的,这时候就本库的做法就是移动ViewController,通过修改 ViewController 的 frame 值来达到目的,当然这里的 ViewController 不一定是输入框所在的 ViewController, 在方法 @objc func parentContainerViewController() -> UIViewController?中有一套判断逻辑,感兴趣的同学可以看下源码。

主要部分就是这些,当然本库还封装了一些例如添加 BarItem 等类,这里就不做过多的介绍了。

最后

以上就是本篇的内容,势必会有一些遗漏和错误的地方,欢迎斧正~

相关文章

网友评论

      本文标题:IQKeyboardManagerSwift 源码阅读

      本文链接:https://www.haomeiwen.com/subject/xgrkhhtx.html