IOS中键盘自动隐藏

Wesley13
• 阅读 490

前言

很多时候当我们在一个文本框中输入信息后,按了确认或者返回键需要隐藏键盘,或者在其他空白区域点击屏幕后也需要隐藏屏幕。

这时肯定就需要让相应的控件响应Tap事件(点击事件),这样我们才能处理。

实现隐藏的两种方法

在IOS中有一个概念叫First Responder,意指第一响应者,也就是当前屏幕上,处于焦点状态的控件,它是第一响应者,我们在界面的触摸的各种手势都是由这个控件接收的。那么很好理解,当用户点击一个输入框之后,弹出输入键盘,此时这个文本输入框便是第一响应者,那现在要隐藏键盘,其实就是不让这个文本输入框作为第一响应者。

文本输入框为我们提供了这么一个方法:resignFirstResponser

UITextField.resignFirstResponder()

这样就取消了这个文本输入框的第一响应者身份了,键盘也就自动隐藏了。

当有很多输入框时,我们还可以使用UIView提供一个就更快的方法:endEditing

UIView.endEditing(true)

直接把整个UIView的编辑状态取消掉,那不管界面上哪个输入框作为第一响应者身份,都能被取消编辑状态,键盘也就消失了。

如何触发

知道了如何让键盘隐藏,那就要在恰当时机去执行它。通常有两种方法:

1)键盘右下角的return、完成按钮被点下时

2)输入框周围的空白区域被点击时

第一种方法,需要处理输入框的DidEndOnExit事件:

@IBAction func txt_DidEndOnExit(sender: UITextField) {
    sender.resignFirstResponder()
}

可以把n个输入框的DidEndOnExit事件都关联到这个事件方法上,这样就不用一个个写重复代码了。

第二种方法,当点击空白区域时,键盘自动隐藏,一般这个空白区域就是一个UIView,我们需要让UIView响应点击(tap)事件,但是要知道响应事件是UIControl的事情,所以,我们需要把这个UIView改成UIControl,因为UIControl是UIView的子类,所以完全可行!

IOS中键盘自动隐藏

把View的Class改成UIControl,那么这个View就能像UIControl那些控件一样,可以接收点击事件了。

IOS中键盘自动隐藏

我们处理这个大Control的Touch Down事件:

@IBAction func touchDown(sender: UIControl) {
    txtName.resignFirstResponder()
}

注意,这时就不是用sender对象了,sender是UIControl的,我们是要让输入框取消第一响应者状态。

这里仅争对使用普通UIView的界面,当使用UTableViewController时,就不能用这种方法咯,需要手动创建一个手势识别器,将它关联到整个UITableViewController

使用UITableViewControl这种控件时如何触发

要知道,手势识别器可以很灵活的关联到任意一个View上,所以我们可以为UITableViewController创建一个UITapGestureRecognizer的点击识别器。

在ViewDidLoad方法中写入:

override func viewDidLoad() {
    super.viewDidLoad()
    var tap = UITapGestureRecognizer(target: self, action: "keyboardHide:")
    tap.cancelsTouchesInView = false
    self.view.addGestureRecognizer(tap)
}

func keyboardHide(tapG:UITapGestureRecognizer){
    //整个view  结束编辑状态(方法一)
    self.view.endEditing(true)
    //单个输入框(方法二)
    self.txtUserName.resignFirstResponder()
}

这样整个 UITableViewController的空白区域都能接收tap事件了,也就实现了隐藏输入框的功能。

tips:

本文由wp2blog导入,原文链接:http://devonios.com/ios-hide-keykeyboard.html

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Chase620 Chase620
3年前
iOS开发:后台运行以及保持程序在后台长时间运行
第一部分1.先说说iOS应用程序5个状态:停止运行应用程序已经终止,或者还未启动。不活动应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。活动app处于“使用中”的状态。后台app不再屏幕上显示,但它仍然执行代码。挂起app仍然驻留内存但不再执行代码。按下Home键时,app从活动状态转入后台,绝大部分app通
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
DOM元素的自动隐藏
在一些有悬浮元素的场景中,比如点击一个按钮弹出菜单后,点击菜单以外的地方,菜单应该被隐藏起来。隐藏的方式最好是自动隐藏,或至少是组件内的自动隐藏。蒙层比如,一个模态框组件(闭包实现)点击蒙层时,响应蒙层的点击事件,可以在事件处理函数中隐藏整个组件。在Vue和React等框架的组件中,这一点非常容易实现。<divclass"com
Stella981 Stella981
2年前
ExtJS表单提交时,不用鼠标点击按钮提交,直接通过回车键提交
用ExtJs实现登陆界面,输入用户名和密码,点击确定后登陆。然而人们习惯于在输入两者后按回车键进行登陆。在extjs中,Button本身是支持回车事件的,前提是:焦点在按钮上,此时回车和单击事件是一回事。form中的field事件中有specilkey事件,可以响应回车键。在输入用户名,或者密码后点击"回车",让field响应回车事件,然后通过form提
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究