当一个界面上有个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. 【知识积累】爬虫之网页乱码解决方法(gb2312 -> utf-8)

    前言 今天在测试爬虫项目时,发现了一个很严肃的问题,当爬取的网页编码格式为gb2312时,按照一般的办法转化为utf-8编码时总是乱码,PS:爬取的所有网页无论何种编码格式,都转化为utf-8格式进行 ...

  2. Cannot override the final method from SherlockFragmentActivity

    调用ActionBarSherlock后页面找不到onCreateOptionsMenu报错 com.actionbarsherlock.app.SherlockFragmentActivity.on ...

  3. 基于HTML5的WebGL结合Box2DJS物理引擎应用

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

  4. 使用James搭建一个自己的邮箱服务器

    ---第一天开发--- 下载Apache James 3.0邮箱服务器,解压到响应的目录 可以看到目录结构: H:\code\JavaCode\James\apache-james-3.0-beta4 ...

  5. python sqlite中通过字段名获取查询结果

    在连sqlite数据库时,用fetchall()查询结果,是用row[0],row[1]这样的方式来打印每列的结果 但是我想用row[“字段名”]方式查询怎么办? import sqlite3 con ...

  6. MongoDB2.6 新特性

    MongoDB 2.6 已经在今天发布,当然,关注MongoDB的同志自然知道这个消息. 整个MongoDB2.6,个人觉得认证系统是一个重新设计的系统.当然,MongoDB 2.4.6开始,就已经在 ...

  7. 使用ActivityGroup类显示多个Activity

    有些情况下需要把一个Activity分割成几部分,如上半部分绘制图形,下半部分显示图表,这时就需要用到ActivityGroup. 定义一个类继承自ActivityGroup,Java文件如下: pa ...

  8. 【Java每日一题】20161116

    package Nov2016; public class Ques1116 { public static void main(String[] args){ System.out.println( ...

  9. No.018:4Sum

    问题: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  10. Spring之AntPathMatcher

    前言 AntPathMatcher是什么?主要用来解决什么问题? 背景:在做uri匹配规则发现这个类,根据源码对该类进行分析,它主要用来做类URLs字符串匹配: 效果 可以做URLs匹配,规则如下 ? ...