你的位置:首页 > 操作系统

[操作系统]根据键盘调整textField(多个)位置使其不会被键盘挡住


当一个界面上有个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的状态
 
效果如图:
几月去长沙旅游最好去长沙的旅游团价格去长沙旅游必去景点去长沙旅游要多少钱去长沙旅游最佳路线普吉岛自助游酒店推荐,普吉岛自助游酒店,普吉岛酒店推荐 沙巴旅游酒店推荐,沙巴酒店推荐,沙巴酒店推荐 去韩国旅游带什么,去韩国旅游带什么好,去韩国旅游要带什么东西 巫山小三峡门票_巫山小三峡门票价格_巫山小三峡门票多少钱 海南小吃椰丝包 海南美食抱罗粉 海南四大名菜 亚龙湾海底世界门票价格 泰国浴_泰国旅游攻略 泰国印象:性感人妖令人难忘的美丽怪物 【最出名的十样泰国美食】 吉、PP岛7日自助游!不懂英文也能玩好 第七届中国·高淳国际慢城金花旅游节 2015广东禾雀花节在哪里?东莞哪里禾雀花好看? 2015清溪赏花节有什么花?清溪赏花旅游节要门票吗? 漫步厦门五大城市公园 最美的风景都是免费的 SPP04N60C3 Datasheet SPP04N60C3 Datasheet SPA04N60C3 Datasheet SPA04N60C3 Datasheet SPU04N60C3 Datasheet SPU04N60C3 Datasheet 鼓浪屿旅行社 鼓浪屿旅行社 鼓浪屿旅行社 康辉旅行社 康辉旅行社 康辉旅行社 欧洲有哪些国家 欧洲有哪些国家 欧洲有哪些国家