当一个界面上有个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功能很强大,但是相对也就比较复杂,我是没看懂怎么用(惭愧)。。。
 
所以我就自己写了一个库,基本也解决了上述的问题,功能也相对简单,用起来也相对简单。
 
核心思路是:
1,用一个单独的类来保存keyboard的相关状态
2,把textField调整到屏幕可视范围内的适当位置,而不是紧贴着键盘(参考TPKeyboardAvoiding的思路)
3,用一个isKeyboardShow的属性来记录键盘是否已经出现,然后根据这个状态来做出不同的调整
4,键盘通知的selector里只需处理isKeyboardShow的状态
 
效果如图:
 
现在可以支持scrollView,tableView,collectionView或者cell上的textField,其他有需要可以再加
如果有什么bug,欢迎指出,大家一起讨论 

根据键盘调整textField(多个)位置使其不会被键盘挡住的更多相关文章

  1. StringGrid 实例4 本例功能: 1、给每个单元格赋值 2、调整当前单元格位置:上下左右;

    实例4 本例功能:1.给每个单元格赋值 2.调整当前单元格位置:上下左右: 运行效果图:

  2. LinearLayout的gravity属性以及其子元素的layout_gravity何时有效;RelativeLayout如何调整其子元素位置只能用子元素中的属性来控制,用RelativeLayout中的gravity无法控制!!!

    LinearLayout的gravity属性以及其子元素的layout_gravity何时有效:RelativeLayout如何调整其子元素位置只能用子元素中的属性来控制,用RelativeLayou ...

  3. 剑指Offer-13:调整数组位置使奇数位于偶数前面

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.例如给定一个数组 ...

  4. oracle序列使用时 先用伪列将序列的id调整到正确的位置

  5. (iOS)关于键盘遮挡textfield问题

    记录一下自己经常遇到问题.使用textfield(textview).当输入框位置比较靠下时,弹出的键盘会遮挡输入框,这是就需要动态移动输入框编辑状态时self.view的位置, 自己经常用的方法有两 ...

  6. UIToolbar 如何调整里面的按钮位置

    可以在Bar Button Item后面填个Fixed Space Bar Button Item 或者Flexible Space Bar Button Item,然后再在后面加上下一个Bar Bu ...

  7. iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]

    自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...

  8. 返回键 隐藏、、收起键盘textView|textField

    /** 隐藏 返回键 的做法,将title置为空 */ self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWith ...

  9. 学习ios键盘和textfield之间操作体会

    所需要计算就是,键盘移动以后是否遮挡住了textfield,需要用到的计算公式: int offset = 键盘的高度-(self.frame.size.height - self.textfiled ...

随机推荐

  1. JS实现base64加密解密

    JS实现base64加密解密 转载自http://blog.csdn.net/fengzheng0306/archive/2006/04/25/676055.aspx 方法一: <HTML> ...

  2. 20套高品质的 Mobile & Web 界面 PSD 素材免费下载

    在这里,我们向大家呈现20个新鲜出炉的矢量的免费 PSD 素材.这些素材来自著名的设计社区——Dribbble,这个网站的用户不断发布各种精美的用户界面,图标和网站布局,以帮助激励他人.这些免费素材不 ...

  3. 扩展HT for Web之HTML5表格组件的Renderer和Editor

    在HT for Web提供了一下几种常用的Editor,分别是: slider:拉条 color picker:颜色选择器 enum:枚举类型 boolean:真假编辑器 string:普通的文本编辑 ...

  4. WCF会话(Session)与实例(Instance)管理

    一.理解Session 1.Session的作用:保留Client和Service之间交互的状态,确保Client与Service之间交互唯一性(SessionId),即:多个Client同时访问Se ...

  5. 30天C#基础巩固------了解委托,string练习

    ---->了解委托.     生活中的例子:我要打官司,我需要找一个律师,法庭上面律师为当事人辩护,它真正执行的是当事人的陈词,这时律师 就相当于一个委托对象.当事人则委托律师为自己辩解.    ...

  6. 让sublime实现js控制台(前提是安装了nodejs)

    步骤: 1.找到tools-->build system-->new build system 2.输入 { "cmd": ["D://nodejs/node ...

  7. .NET Nancy 详解(三) Respone 和 ViewEngine

    我们在ASP.NET MVC中可以返回各种类型的ActionResult(以下图片来自于园友--待补..) 在Nancy 中本着简单粗暴的原则,使用方式略有不同.这期我们使用的版本是Nancy的第一个 ...

  8. 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)

    注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ...

  9. 史上最全系列Android开发环境搭建

    一.安装JDK1.JDK下载打开网站http://www.oracle.com/technetwor ... nloads-1880260.html,选择相应的操作系统下载JDK 2.安装JDK本机是 ...

  10. C#异步调用的方法

    最经公司工作需要调用一个外部的webservice,同时要将传出的数据进行保存,以自己以前的习惯,就打算逐步操作,失败啊,完全没考虑过用户体验效果,在同事指点下,意识到使用异步调用的好处,随便将自己找 ...