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

转自: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函数中添加这些代码,这样屏幕就会返回正常了。

时间: 2024-11-03 22:00:10

iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘挡住UITextField的方法的相关文章

iOS关闭虚拟键盘方法汇总_IOS

在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作,但如何关闭虚拟键盘,却没有提供自动化的方法.这个需要我们自己去实现.这三类视图对象分别是UITextField,UITextView和UISearchBar. 这里介绍一下UITextField中关闭虚拟键盘的几种方法. 第一种方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:来关闭虚拟键盘. 在UITextField视图对象如birdNameInput所在的类中实现这个方法

win8系统怎样开启虚拟键盘功能?

  win8系统怎样开启虚拟键盘功能? 1.首先,鼠标移动到桌面最下方的工具栏,右键弹出菜单; 2.选择工具栏-虚拟键盘,选择虚拟键盘; 3.勾选虚拟键盘后,工具栏位置会出现一个键盘模样的图标,如图所示,点开它; 4.打开之后,就出现了虚拟键盘,如图所示,随意输入几个字试试; 5.如果觉得宽度不够,可以点虚拟键盘右上角的放大,如图所示,键盘变成宽屏了. windows7教程 windows8教程 windows10教程

html5-H5页面实现摇一摇功能 在ios上摇动时 出现 撤销 重做 弹出框?这个有什么解决办法?谢谢各位!

问题描述 H5页面实现摇一摇功能 在ios上摇动时 出现 撤销 重做 弹出框?这个有什么解决办法?谢谢各位! 如题,就是在摇动以后,就会出现的一个弹框.这个查了好久也没找到问题 解决方案 http://www.jb51.net/html5/64644.html

常用图片上传带预览功能方法

常用图片上传带预览功能方法 一下为常见的图片预览实现方式,但是当远程访问该页面 的时候仍然会出现无法预览的情况,但是很多人用,应该也会发现有问题.代码如下.   <%@ page language="c#" autoeventwireup="true" codefile="photoupload.asp教程x.cs" inherits="photoupload" %> <!doctype html publi

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.       下载:https://github.com/mwaterfall/MWPhotoBrowser   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下Gith

《iOS 8开发指南(第2版)》——第1章,第1.6节iOS的常用开发框架

1.6 iOS的常用开发框架iOS 8开发指南(第2版)为了提高开发iOS程序的效率,除了可以使用Xcode集成开发工具之外,还可以使用第三方提供的框架,这些框架为我们提供了完整的项目解决方案,是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易.在OSX下的Mac操作系统中,大约存在80个框架,这些框架可以用来开发应用程序,处理Mac的Address Book结构.刻制CD.播放DVD.使用QuickTime播放电影.播放歌曲等. 在iOS的众多框架中,其中有两个

iPhone5和iOS6上HTML5开发的新增功能

开发移动应用到底是选择Native.Web应用或者混合应用?答案是不同的移动应用需要不同的技术,选择合适的就行.其实大多数移动应用,不管是企业移动应用还是互联网移动应用,90%都可以使用基于HTML5的Web技术就足够.在Android 4.0和iOS 6以上浏览器已经是最快的应用了,比任何本地的微博.微信都快,无须更新升级,无须上传分裂的APP市场,无须突然被苹果下架应用.再看看最近发布 Firefox OS 开发手机的配置也大概知道,运行大多数应用不需要那么高配置. 目前主流的智能终端中,i

vps上常用的操作系统选择问题

vps上常用的操作系统是linux(有多种发行版).freeBSD,windows server等.一般来说,vps的操作系统不是自由安装的,linux系列vps可以安装多个linux发行版,但不能装windows;相对,windows系列vps也不能改装linux. 这点在购买时要首先考虑,根据你的需求确定买哪种vps 笔者强烈推荐使用linux: linux效率高,对硬件配置要求低;安全性高;不需要运行图形界面.可以自由精简不必要的功能.节约下来的系统资源用来跑应用;丰富多样的网络应用软件,

微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析

微信双开是定时炸弹? 关于非越狱iOS上微信分身高危插件ImgNaix的分析 作者:蒸米@阿里聚安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频繁更换微信账号也是一件非常麻烦的事,于是大家纷纷在寻找能够在手机上登陆多个微信账号的方法,相对于iOS,Android上早就有了很成熟的产品,比如360 OS的微信双开和LBE的双开大师就可以满足很多用户多开的需求. 但是在