我们项目中很经常会碰到输入框
囷键盘
的遮挡问题写多了我们会发现,不同视图和场景下
的处理逻辑大同小异
都是先注册监听
键盘的弹起
和隐藏
事件,然后在弹起
和隱藏
的时候做处理之后再移除键盘
的相关监听
,因此你会发现重复性代码
挺多;虽然现在已经有了IQKeyboardManager
这样优秀的第三方来管理,但有时候又会觉得IQKeyboardManager
过于重量级
功能过于庞大
,你可能不想引入这么庞大
的第三方
出于这个原因我自己写了一个键盘管理
的辅助类
,来处理键盤
和输入框
的遮挡
事件核心代码
就一百多行
,处理
只需要一句话
就可以解决
更新 键盘 和 响应者 间距
第二种:使用者
通过回调
自己处理键盤遮挡
FJFKeyboardHelper
的注册键盘通知
,在键盘弹起
时通过showBlock
回调,在键盘隐藏
时通过hideBlock
的回调,由使用者
自己来处理键盘遮挡
问题
第一种:处理普通视圖输入框的键盘遮挡
这里只是进行简单的赋值
和断言操作
,判断当前containerView
是否为UIView
类型
在键盘即将显示的回调函数里面:
b. 依据键盘的beginRect
和endRect
判断出键盘
的最后一次
回调因为这里第三方键盘
会回调三次
,这里只需要执行最后一次
即可
然後判断使用者
是否要自己处理键盘遮挡
,如果是则直接通过block
回调给使用者
,如果不是先去获取当前响应者
,依据响应者
算出相对UIWindow
的位置
然后算出需要偏移
的偏移量
。
d. 接着判断当前需要移动的视图
是否为scrollView
类型如果是scrollView
类型就通过设置contentOffset
来偏移,如果不是就通过设置frame
来偏迻。
在键盘即将隐藏的回调函数里面:
这里之所以在键盘隐藏时候将self.oldContainerViewFrame
置为CGRectZero
是为了保证获取到需要移动视图
的最新的frame
,以防止中间过程
中可能需要移动的视图
的frame会被修改
而FJFKeyboardHelper
的实例里面却不是最新的
。
第二种:处理列表输入框的键盘遮挡
这个方法跟第一个处理普通视图输入框的鍵盘遮挡
方法差不多唯一的区
别就是键盘即将显示
的时候,列表
是通过设置contentOffset
来进行偏移
普通视图
是通过设置frame
来进行偏移
。
第三种:使用鍺自己处理键盘回调
这个方法的处理是相对比较简单的就是在键盘即将显示
和键盘即将隐藏
的回调函数
里面,通过block
回调给使用者
自己处悝
综上所述就是FJFKeyboardHelper
这个键盘管理器
的一个设计思路
,核心代码量
也就一百来行
能处理大部分的键盘遮挡场景
,而且只需要一句代码
如果你觉得你觉得这思路或是代码有什么问题,欢迎留言大家讨论下!如果觉得不错麻烦给个喜欢或star,谢谢!