最近开发的页面中有一个输入订单号的功能,由于产品设计时将输入框放在页面靠下的位置,所以一般情况下,用户需要输入时,弹出的键盘会将其遮挡。但是项目中已经引入了 IQKeyboardManager 第三方库来解决这个问题,为什么它没有起作用?
修复bug的第一步:
怀疑是配置不对,经过查阅资料发现,在默认配置下 IQKeyboardManager 就会起作用,无需特殊配置。
第二步:
发现点击筛选时,弹出的视图直接加在了 keyWindow 上,经过修改,将其放在当前控制器的导航控制器的 View 上,发现偶尔可以不遮挡键盘。为什么会出现这种状况?持续跟进,在 IQKeyboardManager 核心代码中进行断点调试,发现 IQKeyboardManager 会查找文本输入框控件所在的 Controller ,而且还会查找文本输入框控件是否存在于 ScrollView 及其子类中。如果有 ScrollView ,会改变 ScrollView 的 ContentOffset 来避免输入框被键盘遮挡。
第三步:
查看 ScrollView 配置是否异常,项目代码中并未发现 ScrollView 有配置异常的情况,无奈只好继续断点调试,发现一个规律:当输入框被遮挡时,IQKeyboardManager 中获取到 ScrollView 的 ContentSize 总是 {0, 0},回到项目代码里发现在大屏幕手机上确实没有设置 ContentSize 属性,小屏幕手机上才会配置这个属性。在代码中设置,默认情况下,ScrollView 的 ContentSize 等于其 Size,问题解决。
备注:
开发环境:Xcode 9.4.1,iOS 12 Public beta 3,iPhone 6s Plus (不知此bug出现是否和开发环境有关)