根据键盘调整textField(多个)位置使其不会被键盘挡住

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

当一个界面上有个textField时,键盘出现时需要保证textField不会被键盘挡住。

一般的做法是,监听 UIKeyboardWillShowNotification和 UIKeyboardWillHideNotification,在通知的selector方法中通过notification.userInfo获取键盘的相关信息,然后调整界面的位置。

但是当界面上有两个以上的textField时,问题来了:在textField之间切换的时候UIKeyboardWillShowNotification这个通知不一定会发!

据观察,只有当键盘的大小发生变化的时候,系统才会再次发出UIKeyboardWillShowNotification通知。。。

例如数字键盘变到英文键盘,键盘大小不变,所以不会发通知,

英文键盘变到中文键盘,键盘大小改变,所以会再发一次willShow通知,其他类似

所以问题是:界面上有多个textField,有的被挡住了,有的没有被挡住,想要在切换textField的时候每次都可以把目标textField移动到不被挡住的位置,怎么办?(最常见的,登陆界面有账号,密码两个textField,两个都输入的时候分别要移动到合适的位置)

在- (void)textFieldDidBeginEditing:(UITextField *)textField的时候调整位置?

如果这时候键盘还没出现,那这个方法的调用是在系统发UIKeyboardWillShowNotification通知之前的

如果键盘已经出现,那系统可能不会再发UIKeyboardWillShowNotification通知,这时候你不一定知道键盘的大小,(而且问题是系统不一定发,如果是一定不发,那还好处理一点)

如果记录下来第一次键盘出现时键盘的大小,切换textField的时候依然用这个保存的大小,那调整的位置可能不准。。。

如果针对这一个viewController来写死某些数值的话,那适配3.5寸或者4寸或者4.7寸或者5.5寸屏幕的时候,又该出问题了

这个问题困扰了我很久,后来研究了github上大神的代码,才找到比较理想的解决方案,

大神的第三方库:

TPKeyboardAvoiding

IQKeyboardManager

这两个库都很好的解决了上述问题,但TPKeyboardAvoiding用起来稍微有点麻烦,需要继承,

IQKeyboardManager功能很强大,但是相对也就比较复杂,我是没看懂怎么用(惭愧)。。。

所以我就自己写了一个库,基本也解决了上述的问题,功能也相对简单,用起来也相对简单。

demo地址:https://github.com/Phelthas/LXMKeyboardManager

核心思路是:

1,用一个单独的类来保存keyboard的相关状态

2,把textField调整到屏幕可视范围内的适当位置,而不是紧贴着键盘(参考TPKeyboardAvoiding的思路)

3,用一个isKeyboardShow的属性来记录键盘是否已经出现,然后根据这个状态来做出不同的调整

4,键盘通知的selector里只需处理isKeyboardShow的状态

效果如图:

现在可以支持scrollView,tableView,collectionView或者cell上的textField,其他有需要可以再加

如果有什么bug,欢迎指出,大家一起讨论

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航