原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954

iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现,

首先是点击return和屏幕隐藏键盘

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

在 iOS 程序中当想要在文本框中输入数据,轻触文本框会打开键盘。对于 iPad 程序,其键盘有一个按钮可以用来关闭键盘,但是 iPhone 程序中的键盘却没有这样的按钮,不过我们可以采取一些方法关闭它。例如,我们可以实现按下 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 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘相关推荐

  1. 推特开始在 iOS 上实验推、嘘功能

    Twitter 部份 iOS 上的推特用户,可能很快就会发现推文回应底下多了几颗以前没见过的按键了.为了实验如何让回应的排序更符合用户的期望,推特将开始试验各种不同的推.嘘方案来收集数据,以利未来决定 ...

  2. 在iOS上实现二维码功能

    如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.而手机等移动设备又成为二维码的一个很好的应用平台,不管是生成二维码还是扫码二维码. 下面介绍一下如何在苹果iOS设备上使用二维码: ...

  3. jquery 文件上传 触发两次_点击三次input按钮,前两次不选择任何文件,第三次选择一个文件,结果上传了3个文件,即发生了三次请求...

    点击三次input按钮,前两次不选择任何文件,第三次选择一个文件,结果页面上出现了3个文件,也就是上传了3个文件 我点击input,不选择任何文件,然后取消文件选择器的窗口,然后第二次次点击input ...

  4. Flash在移动设备上控制虚拟键盘

    移动设备(如手机和平板电脑)通常提供一种虚拟的软件键盘而不是物理键盘.使用 Flash API 中的类可以执行以下操作: 1.检测虚拟键盘何时开启和关闭. 2.阻止键盘开启. 3.确定被虚拟键盘覆盖的 ...

  5. yarn架构——本质上是在做解耦 将资源分配和应用程序状态监控两个功能职责分离为RM和AM...

    Hadoop YARN架构解读 原Mapreduce架构 原理 架构图如下: 图 1.Hadoop 原 MapReduce 架构 原 MapReduce 程序的流程: 首先用户程序 (JobClien ...

  6. 可以在xmind上同时有两个大主题吗_6大IPAD常用笔记软件横向对比,总有一款适合你|品职效率实验室...

    大家都知道,我们的公众号有一个品职效率实验室系列,里面发布过很多篇有关ipad学习软件的介绍文章,不过也有小伙伴向我们反馈时说:"我有了ipad(pro,air),有了apple penci ...

  7. iOS比较常用的第三方及实例(不断更新中)

    把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新: 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...

  8. iOS开发常用三方库、插件、知名博客

    TimLiu-iOS iOS开发常用三方库.插件.知名博客等等,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交Issues即可). 持续更新... 版本:Objective- ...

  9. ios 关于常用的一些第三方框架的介绍

    本文转载自:http://blog.csdn.net/xiaoyuertongxue/article/details/46982879 图像:  1.图片浏览控件MWPhotoBrowser 实现了一 ...

最新文章

  1. linux以非root身份运行,以非root用户身份在linux中运行mono-service
  2. python中数组的del,remove,pop区别详解
  3. vb.net2019-hello,world
  4. GridControl动态添加 颜色列
  5. mysql awk_Awk实用手册(全)
  6. 这样的AI技术实战方式,大boss都看不下去了!
  7. 14. PHP 数组排序
  8. C语言杨辉三角形代码
  9. 小程序图片src本地服务器路径,微信小程序 图片加载(本地,网路)实例详解...
  10. android 声音不想从蓝牙手机中出来,Android蓝牙音频两个问题
  11. orcad基础全操作(直流分析,交流分析,瞬态分析,静态工作点,噪声分析)
  12. 百度快照劫持的解决方法
  13. 老男孩Day1作业(二):三级菜单
  14. Cesium隐藏太阳、月亮、大气【图说GIS】
  15. C++程序设计同步实践宝典——前言
  16. canvas动态风车
  17. NOI2010超级钢琴
  18. 目标是100个百亿级大客户,赛意信息为何如此有底气?
  19. halcon三维检测启蒙1
  20. 开学splay(这个模版要背的滚瓜烂熟)

热门文章

  1. 静态分析C语言生成函数调用关系的利器——cflow
  2. 海思3559A上编译GDB源码操作步骤及简单使用
  3. 一维码Code 93简介及其解码实现(zxing-cpp)
  4. 利用JNI技术在Android中调用C++代码
  5. C++之Boost使用
  6. java好用的hbase库_Hbase入库基于java
  7. input反应慢 vue_Vue v-model实时更新带来的输入框卡顿问题
  8. Java项目:高校学生社团活动管理系统(java+springboot+freemark+jpa+mysql)
  9. python空值填充_pandas | DataFrame基础运算以及空值填充
  10. 【数据库】数据库基本操作