·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 根据键盘调整textField(多个)位置使其不会被键盘挡住

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

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

当一个界面上有个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,欢迎指出,大家一起讨论