`
mikixiyou
  • 浏览: 1099104 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353194
社区版块
存档分类
最新评论

关闭ios虚拟键盘的几种方法

    博客分类:
  • iOS
阅读更多

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

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1753330 )


第一种方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:来关闭虚拟键盘。
在UITextField视图对象如birdNameInput所在的类中实现这个方法。

 

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if ((textField == self.birdNameInput) || (textField == self.locationInput)) {
        [textField resignFirstResponder];
    }
    return YES;
}
 


这样,在输入框birdNameInput中打开虚拟键盘后,轻击键盘的return键就会自动关闭掉虚拟键盘。

第二种方法,将birdNameInput的属性中Return Key修改为done,再定义一个方法和Done键的Did End On Exit连接。通过轻击done键触发这个事件来关闭虚拟键盘。
定义的方法如下:

 

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

 


这两个方法都是轻击虚拟键盘上一个键来关闭它。这属于精确操作,而手指不像鼠标,做这种操作不容易。因此就UI层面而言,这两个方法都不是最好的方法。
在iphone或ipad屏幕上,虚拟键盘占用的面积大小是有限的。通过轻击虚拟键盘之外的区域而关闭虚拟键盘。

 

第三种方法,通过轻击键盘之外的空白区域关闭虚拟键盘。
在birdNameInput所属的视图控制器类的viewDidLoad方法中定义一个UITapGestureRecognizer的对象,然后将它赋值为它的视图。

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]   initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
[tap release];

 

再定义一下选择器调用的方法dismissKeyboard。

-(void)dismissKeyboard {
       [birdNameInput resignFirstResponder];
}

 
如果屏幕上有多个textField的话,一个一个地列出来就有些麻烦。那么将方法修改一下,如下:

-(void)dismissKeyboard {
    NSArray *subviews = [self.view subviews];
    for (id objInput in subviews) {
        if ([objInput isKindOfClass:[UITextField class]]) {
            UITextField *theTextField = objInput;
            if ([objInput isFirstResponder]) {
                [theTextField resignFirstResponder];
            }
        }
    }
}
 



如果这个屏幕上的视图对象很复杂的话,另当别论。
这个方法是编码新建一个手势对象。也可以直接使用interface builder图形化开发工具,在storyboard中拉入一个手势对象到视图控制器类中,再将此手势对象建立一个IBACTION,名称可以是dismissKeyboard。

第四种方法,通过轻击键盘之外的空白区域关闭虚拟键盘。
将屏幕上的view也就是textField的父视图拖一个touch down事件出来,和一个能关闭虚拟键盘的方法连接。如果视图没有touch down事件,可将view的父类从UIView修改为UIButton。
首先定义并实现一个方法backgroundTap:。

 

- (IBAction) backgroundTap:(id)sender
{
        NSArray *subviews = [self.view subviews];
    for (id objInput in subviews) {
        if ([objInput isKindOfClass:[UITextField class]]) {
            UITextField *theTextField = objInput;
            if ([objInput isFirstResponder]) {
                [theTextField resignFirstResponder];
            }
        }
    }
}
 


然后选择背景视图的Touch Down事件,连接 backgroundTap:即可。这样只要轻击一下虚拟键盘之外的区域,就能关闭虚拟键盘。这些方法都是使用resignFirstResponder方法来关闭虚拟键盘,还有其他的方法。

 

第五种方法,使用endEditing:方法
在所在的视图控制器类中,覆盖这个方法。

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
      [[self view] endEditing:YES];
}
 


This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.
但是,如果这个屏幕很复杂,虚拟键盘之外的区域中有很多按钮。轻击这些区域时可能会轻击到这些按钮,这样虚拟键盘就不能关闭。
要是找到一个没有按钮的空白区域都不容易且还有隐藏的视图对象时,通过轻击虚拟键盘之外的区域关闭虚拟键盘的方法实现起来就难了。

 

第六种方法,覆盖hitTest:withEvent:方法关闭虚拟键盘

 

在stackoverflow.com上,有人这样总结。说使用hitTest:withEvent:方法是最好的,也是最容易的解决方法。

 

I think the easiest (and best) way to do this is to subclass your global view and use hitTest:withEvent method to listen to any touch.
Touches on keyboard aren't registered, so hitTest:withEvent is only called when you touch/scroll/swipe/pinch... somewhere else, then call [self endEditing:YES].
This is better than using touchesBegan because touchesBegan are not called if you click on a button on top of the view.
It is better than UITapGestureRecognizer which can't recognize a scrolling gesture for example. It is also better than using a dim screen because in a complexe and dynamic user interface, you can't put dim screen every where. Moreover, it doesn't block other actions, you don't need to tap twice to select a button outside (like in the case of a UIPopover).
Also, it's better than calling [textField resignFirstResponder], because you may have many text fields on screen, so this works for all of them.

 

因此,我再建立一个继承UIView的视图类。在这个视图类中,覆盖hitTest:withEvent:方法,增加[self endEditing:YES]方法。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *result = [super hitTest:point withEvent:event];
[self endEditing:YES]
return result;
}
 


我将视图控制器的主视图所属类修改为这个新建视图类。这样在屏幕上轻击任何位置都会关闭虚拟键盘。
这个方法是最简单,也是最好的关闭虚拟键盘的方法。
使用好hitTest:withEvent:这个方法,还可以实现很多很复杂的功能。
The implementation of hitTest:withEvent: in UIResponder does the following:

  •     It calls pointInside:withEvent: of self
  •     If the return is NO, hitTest:withEvent: returns nil. the end of the story.
  •     If the return is YES, it sends hitTest:withEvent: messages to its subviews. it starts from the top-level subview, and continues to other views until a subview returns a non-nil object, or all subviews receive the message.
  •     If a subview returns a non-nil object in the first time, the first hitTest:withEvent: returns that object. the end of the story.
  •     If no subview returns a non-nil object, the first hitTest:withEvent: returns self

This process repeats recursively, so normally the leaf view of the view hierarchy is returned eventually.
However, you might override hitTest:withEvent to do something differently. In many cases, overriding pointInside:withEvent: is simpler and still provides enough options to tweak event handling in your application.

分享到:
评论
1 楼 吃饱了就饿 2012-12-31  
总结的好,实用

相关推荐

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

    在iOS开发中,特别是在iOS 7及更高版本中,用户界面设计的一个常见问题是虚拟键盘弹出时会遮挡UITextField或UITextView,导致用户无法看到正在输入的文本。本篇文章将详细探讨如何解决这一问题,主要关注如何在iOS 7...

    iOS关闭虚拟键盘方法汇总

    这里介绍一下UITextField中关闭虚拟键盘的几种方法。 第一种方法,使用它的委托UITextFieldDelegate中的方法textFieldShouldReturn:来关闭虚拟键盘。 在UITextField视图对象如birdNameInput所在的类中实现这个方法...

    总结IOS关闭键盘/退出键盘的五种方式

    这是一种很直觉的方法,当不再需要使用虚拟键盘时,只要点击虚拟键盘和编辑区域外的地方,就可以将键盘收起,下面程式码是在 UIView 中内建的触碰事件方法函式,您可以参考 Touch Panel / 触碰萤幕 / 压力感应器的...

    IOS关闭键盘的方法

    总结来说,关闭iOS应用中的虚拟键盘主要依赖于以下几个关键点: 1. 设置Text Field的Return Key为"Done",并关联`textFieldDoneEditing:`方法。 2. 对于没有"Done"键的键盘,可以通过监听背景触摸事件关闭键盘。 3. ...

    登陆页面,解决了因为虚拟键盘的弹起对button的遮挡,

    为了解决这个问题,开发者可以采取以下几种策略: 1. **自动调整布局**:许多现代移动开发框架,如React Native、Flutter或原生的Android和iOS SDK,提供了自动调整布局的选项。当虚拟键盘弹出时,页面可以自动上移...

    禁止手机自带键盘弹出 显示数字键盘

    总的来说,自定义数字键盘是移动应用开发中的一种常见技巧,它允许开发者根据应用需求定制输入方式,提升用户体验,同时也展示了Android或iOS平台的可扩展性和灵活性。通过理解和实现这样的控件,开发者可以深入掌握...

    键盘常用丝印功能介绍.pdf

    iOS的键盘快捷键还包括了虚拟键盘的使用、屏幕截图、亮度调节等。 在Windows系统中,Alt键也扮演了重要的角色,如Alt+Tab用于切换应用程序窗口,Alt+F4用于关闭当前窗口等。此外,Windows特有的快捷键还有WIN+H用于...

    ZLKeyboard-Android:自定义键盘安卓版本

    在Android系统中,键盘通常是由系统提供的,但通过创建一个InputMethodService服务,开发者可以创建自己的虚拟键盘。这个服务允许应用程序接管输入设备,例如触摸屏,以便提供定制的输入方式。ZLKeyboard-Android...

    模拟弹出窗口

    实现模拟弹出窗口的方法有很多种,尤其是在Web开发领域,可以使用JavaScript、jQuery、Vue.js、React等库或框架来创建。例如,HTML中的`<dialog>`元素是原生支持弹出窗口的一个元素,但浏览器支持度并不一致。因此,...

    电子功用-掀盖式电子设备

    4. **输入设备**:根据设备类型,输入设备可能包括物理键盘、触摸板、触控笔或虚拟键盘。这些输入设备使用户能够输入指令,与设备交互。 5. **无线通信技术**:包括Wi-Fi、蓝牙、移动网络(如4G/5G)等,使得设备...

    JAVA上百实例源码以及开源项目源代码

    1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭...

Global site tag (gtag.js) - Google Analytics