iOS经常使用的两个功能:点击屏幕和return隐藏虚拟键盘和解决虚拟键盘挡住UITextField的方法

iOS上面对键盘的处理非常不人性化,所以这些功能都须要自己来实现, 
首先是点击return和屏幕隐藏键盘

这个首先引用双子座的博客 http://my.oschina.net/plumsoft/blog/42545,他的文章写的非常好。对大家的理解非常有优点。

在 iOS 程序中当想要在文本框中输入数据,轻触文本框会打开键盘。对于 iPad 程序。其键盘有一个button能够用来关闭键盘,可是 iPhone 程序中的键盘却没有这种button,只是我们能够採取一些方法关闭它。比如,我们能够实现按下 Rerun (有时也是 Done、Research 等)键关闭键盘。或者。更人性化的,轻触背景关闭键盘。

1、首先讲一下按下Return键关闭键盘。

当按下键盘的 Return 键。会产生一个 Did End On Exit 事件,此时。我们告诉文本框要放弃控件,于是键盘就消失了。

如果,我们已经创建了一个 Single View Application ,并打开 ViewController.xib 文件。在 View 上拖上去了三个 Text Field 。然后。我们把这三个文本框映射到 ViewController.h 中,名称依次是 firstField、secondField 以及 thirdField 。

例如以下图:

在这个基础上,实现轻触 Return 关闭键盘。步骤为:

(1)在 ViewController.h 中声明一个方法:

- (IBAction)textFiledReturnEditing:(id)sender;

(2)在 ViewController.m 中实现这种方法:

-(IBAction)textFiledReturnEditing:(id)sender {
[sender resignFirstResponder];
}

所谓 First Responder 指的就是用户当前正在与之交互的控件。当用户使用键盘时。First Responder 就是这个键盘。resignFirstResponder 方法。顾名思义,就是放弃 First Responder 。

(3)让这三个文本框都映射到 textFiledReturnEditing 方法。只是此时的事件应当是 Did End On Exit ,详细操作是:

打开 Assistant Editor  。左边打开 ViewController.xib ,右边打开 ViewController.h ,在 Xcode 最右边打开 Connector Inspector ,然后在 View 中选择第一个文本框。在 Connector Inspector 中找到 Did End On Exit ,从它右边的圆圈中拉出映射线。映射到 ViewController.h 的 textFiledReturnEditing 方法。例如以下图:

给其它两个文本框进行相同的操作。如今,已经实现了轻触 Return 键关闭键盘。

2、以下介绍更人性化的方法。轻触背景关闭键盘。

跟上面的步骤差点儿相同。首先定义一个方法,然后实现这种方法,接下来将指定的控件映射到这种方法。并选择好所触发的事件。不同的是,这次我们要选择的控件不是上边的文本框。而是视图 View 本身。

(1)在 ViewController.h 文件里加入方法声明代码:

- (IBAction)backgroundTap:(id)sender;

(2)在ViewController.m中实现这种方法:

- (IBAction)backgroundTap:(id)sender {
[firstField resignFirstResponder];
[secondField resignFirstResponder];
[thirdField resignFirstResponder];
}

须要说明的是,[firstField resignFirstResponder];表示。假设firstField有FirstResponder的话就放弃它,我们不用先推断firstField是否有。这条语句全然正确。

(3)让 View 映射到这种方法,只是事先,我们先要改变 View 的类型。

打开xib,选中 View ,打开 Identity Inspector 。在 class 中选择 UIControl :

(4)打开Assistant Editor ,左边打开 ViewController.xib ,右边打开 ViewController.h ,在Xcode最右边打开 Connector Inspector ,在 ViewController.xib 中选择 Control 。在 Connector Inspector 中找到 Touch Down ,从它右边的圆圈中拉出映射线。映射到 ViewController.h 的 backgroundTap 方法,例如以下图:

好了,能够执行下看看效果了:

      

打开键盘之后,在背景区域点击一下,键盘就会向下收起来。

然后点评。在网上也有仅仅写一个 backgroundTap 函数。然后将全部组件都 resignFirstResponser的方法。即 将组件的事件和屏幕的事件指向同一个函数。

这两个方法都是能够用的。可是呢。我更加倾向于使用同一个函数的方法。原因呢,原因就要牵扯到第二个方面的知识:

解决虚拟键盘挡住UITextField的方法

由于屏幕太小的缘故。一个键盘跳出来总是把输入框挡住,所以须要移动屏幕来匹配键盘

#pragma mark -

#pragma mark 解决虚拟键盘挡住UITextField的方法

- (void)keyboardWillShow:(NSNotification *)noti

{

//键盘输入的界面调整

//键盘的高度

float height = 216.0;

CGRect frame = self.view.frame;

frame.size = CGSizeMake(frame.size.width, frame.size.height - height);

[UIView beginAnimations:@"Curl"context:nil];//动画開始

[UIView setAnimationDuration:0.30];

[UIView setAnimationDelegate:self];

[self.view setFrame:frame];

[UIView commitAnimations];

}

-(BOOL)textFieldShouldReturn:(UITextField *)textField

{

// When the user presses return, take focus away from the text field so that the keyboard is dismissed.

NSTimeInterval animationDuration = 0.30f;

[UIView beginAnimations:@"ResizeForKeyboard" context:nil];

[UIView setAnimationDuration:animationDuration];

CGRect rect = CGRectMake(0.0f, 0.0f, self.view.frame.size.width, self.view.frame.size.height);

//CGRect rect = CGRectMake(0.0f, 20.0f, self.view.frame.size.width, self.view.frame.size.height);

self.view.frame = rect;

[UIView commitAnimations];

[textField resignFirstResponder];

return YES;

}

- (void)textFieldDidBeginEditing:(UITextField *)textField

{

CGRect frame = textField.frame;

int offset = frame.origin.y + 32 - (self.view.frame.size.height -
216.0);//键盘高度216

NSTimeInterval animationDuration = 0.30f;

[UIView beginAnimations:@"ResizeForKeyBoard" context:nil];

[UIView setAnimationDuration:animationDuration];

float width = self.view.frame.size.width;

float height = self.view.frame.size.height;

if(offset > 0)

{

CGRect rect = CGRectMake(0.0f, -offset,width,height);

self.view.frame = rect;

}

[UIView commitAnimations];

}

#pragma mark -

 
仅仅要在代码中增加这三个文件。然后将自身delegate
如右上角  就能够实现屏幕的移动了,
可是这里常常会有屏幕移动后不能返回的问题,这里的解决方式就是

- (IBAction)backgroundTap:(id)sender {

NSTimeInterval animationDuration = 0.30f;

[UIView beginAnimations:@"ResizeForKeyboard" context:nil];

[UIView setAnimationDuration:animationDuration];

CGRect rect = CGRectMake(0.0f, 0.0f, self.view.frame.size.width, self.view.frame.size.height);

self.view.frame = rect;

 
在backgroundTap函数中加入这些代码,这样屏幕就会返回正常了。

iOS 键盘挡住UITextField的更多相关文章

  1. 【转】iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法

    iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击return和屏幕隐藏键盘 这个首先引用双子座的博客 http://my.oschina.net/plumsoft/blog ...

  2. 隐藏虚拟键盘,解决键盘挡住UITextField问题

    再正式开始之前,先来介绍一下IOS的键盘类型: 一.键盘风格 UIKit框架支持8种风格键盘 ? 1 2 3 4 5 6 7 8 9 10 typedef enum {      UIKeyboard ...

  3. ios7学习之路七(隐藏虚拟键盘,解决键盘挡住UITextField问题)

    再正式开始之前,先来介绍一下IOS的键盘类型: 一.键盘风格 UIKit框架支持8种风格键盘 typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 ...

  4. React Native(十三)——ios键盘挡住textInput

    渐入佳境 用React Native重构的项目也快接近尾声,剩下的就是适配ios的功能了.慢慢地也从中琢磨出了一点门道,于是就遇见了键盘遮挡textInput问题斑斑: 正常页面: android点击 ...

  5. iOS 解决键盘挡住输入框的问题

    iOS开发中经常会用到输入框UITextField,所以也常会遇到键盘挡住输入框而看不到输入框的内容. 在这里记录一种方法,用UITextField的代理来实现View的上移来解决这个问题. 首先设置 ...

  6. UITableView中cell里的UITextField不被弹出键盘挡住

    UITableView中cell里的UITextField不被弹出键盘挡住 本人视频教程系类   iOS中CALayer的使用 效果如下: 源码: EditCell.h 与 EditCell.m // ...

  7. 【土旦】vue 解决ios H5底部输入框 获取焦点时弹出虚拟键盘挡住输入框 以及监听键盘收起事件

    问题描述 im聊天H5页面,在iOS系统下,inpu获取焦点弹出系统虚拟键盘时,会出现挡住input的情况,十分影响用户体验. bug图 解决方法: html: <input type=&quo ...

  8. iOS开发小技巧--iOS键盘 inputView 和 inputAccessoryView

    iOS键盘 inputView 和 inputAccessoryView 1.inputAccessoryView UITextFields和UITextViews有一个inputAccessoryV ...

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

    当一个界面上有个textField时,键盘出现时需要保证textField不会被键盘挡住. 一般的做法是,监听 UIKeyboardWillShowNotification和 UIKeyboardWi ...

随机推荐

  1. Android技术路线图

    邮件问题: 老师你好,我从去年就在看你的关于Android的视频了,的确讲的不错,去年看了一段时间,寒假的时候回家重新复习了一下Java基础知识,开学的时候看到你又陆续出了一些视频,这段时间看完了,跟 ...

  2. U-Boot 启动过程和源码分析(第二阶段)-main_loop分析

    1> main_loop  common/main.c /******************************************************************** ...

  3. 熬之滴水穿石:Spring--精简的J2EE(5)

                                   47--Spring的MVC 在Spring的框架中也存在MVC这样的模式,在Spring下有2个这样的控制器一个叫Controller, ...

  4. Riak VClock

    Riak VClock 关于向量时钟的概念.在这里就多讲了,大家能够參照一下Dynamo的论文了解一下,向量时钟在分布式主要用于解决一致性性问题.能够和CRDTs一起看. 以下的源码是參照riak中的 ...

  5. 【筛素数表证明】【O[n]】

    void get_prime() { int cnt = 0; for (int i = 2; i < N; i++) { if (!tag[i]) p[cnt++] = i; for (int ...

  6. mysql-5.6.27源码安装及错误解决办法

    wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.27.tar.gz yum install -y cmake  当然也可以自己下载源码包安 ...

  7. 【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用

    <html> <head> <meta http-equiv="Content-Type" Content="text/html; char ...

  8. android中页面的返回刷新

    android中从A activity 打开B activity 操作之后返回A activity,并且A activity状态改变就要用到刷新 我就介绍一下我开发中最常用的方法 引用函数 setRe ...

  9. Linux命令记录。

    引用:http://www.cnblogs.com/xiaoluo501395377/archive/2013/03/31/2992500.html 首先,需要确定的是知道的是:对于Linux系统来说 ...

  10. C# 添加服务引用。

    1,服务引用给的实例(需要一个网址连接) http://192.168.17.131:12170/amtiot.gis.WCF/SpatialAnalysis.svc  (类似于这样的一个网址) 在网 ...