ios中的事件处理和第一响应
2017-10-12 14:05
260 查看
ios中的事件处理、响应者链条以及第一响应者
在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication)。日常生活中,主要有三种类型的事件:触摸事件,加速计事件以及远程遥控事件。下面是官方的一张图片:当用户通过以上方式触发一个事件时,会将相应的事件对象添加到UIApplication的事件队列中。UIApplication会循环的从队列中拿出第一个事件来处理。首先将该事件分发给UIApplication 的主窗口对象(KeyWindow),然后由主窗口决定如何将事件交给最合适的响应者(UIResponder)来处理取决于事件的类型。这里主要分两种情况:
1、触摸事件:UIApplication通过一个触摸检测来决定最合适来处理该事件的响应者,一般情况下,这个响应者是UIView对象。
2、加速计事件或远程遥控事件:UIApplication寻找UIWindow中的第一响应者。找到第一响应者(The First Responder)后,会将该事件对象派发给该响应者以便处理。
下面分别讨论上述两种情况。
一、触摸事件中的触摸检测
首先我们需要明确一个UIView对象能够接收触摸事件至少要保证以下三个条件:1、userInteractionEnabled属性为YES,该属性表示允许控件同用户交互。
2、Hidden属性为NO。控件都看不见,还触摸啥?
3、opacity属性值0 ~0.01,不能透明过分了吧?
接下来的我们仅仅认为该三个基本属性都满足要求,方便描述,当然对于不满足要求的自然是不能接收触摸说事件的。
当用户手指触摸到屏幕中的某一块区域时,UIWindow查找其子控件,然后通过调用所有自控件的方法:
当通过hitTest方法检测获取到UIView后,会继续对该UIView对象做一次检测操作,也就是查找subViews的subViews做触摸检测。最终该方法会返回一个最合适的控件来响应该事件。再次申明,如果之前的三个条件不满足,那么该UIView以及其subViews都不可以响应该触摸事件。
找到响应者后,响应者可以重写以下方法来对触摸事件做响应:
二、第一响应者 (The First Responder)
什么是第一响应者?简单的讲,第一响应者是一个UIWindow对象接收到一个事件后,第一个来响应的该事件的对象。注意:这个第一响应者与之前讨论的触摸检测到的第一个响应的UIView并不是一个概念。第一响应者一般情况下用于处理非触摸事件(手机摇晃、耳机线控的远程空间)或非本窗口的触摸事件(键盘触摸事件),通俗点讲其实就是管别人闲事的响应者。在IOS中,当然管闲事并不是所有控件都愿意的,这么说好像并不是很好理解,或着是站在编程人员的角度来看待这个问题,程序员负责告诉系统哪个对象可以成为第一响应者(canBecomeFirstResponder),如果方法canBecomeFirstResponder返回YES,这个响应者对象才有资格称为第一响应者。有资格并不代表一定可以成为第一响应者,就好像符合要求并不一定能够应聘成功一样,所以还差一个聘用环节,那就是becomeFirstResponder正式成为第一响应者。请原谅我的这些可能不太正常的想法,个人感觉上面的过程又有点像招聘流程,简历筛选就是canBecomeFirstResponder,becomeFirstResponder就是正式成为公司的员工。那么既然公司由聘用,那么对应的就有辞退咯!对应的方法就是canResignFirstResponder,这个表示第一响应者是否可以被辞退,有些牛逼到逆天的员工并不是说辞退就辞退的,争取有一天可以成为这个逆天员工,好吧,我又扯远了。还有一个方法就是resignFirstResponder,正式辞退该员工。
值得注意的是,一个UIWindow对象在某一时刻只能有一个响应者对象可以成为第一响应者。我们可以通过isFirstResponder来判断某一个对象是否为第一响应者。
大家先看下面的一个手机界面:
界面中包含两个输入框,一个切换第一响应者的按钮。我为两个输入框绑定了开始编辑事件,然后在事件中打印第一响应者相关的信息,代码如下:
我们可以看到两个输入框都可以成为第一响应者。但是只有第一个输入框才是第一响应者。
当点击第二个输入框时,打印如下:
我们可以看到两个输入框都是第一响应者,但是只有下面那个输入框才是第一响应者。
我们注意到,两个输入框的下方有一个按钮用于切换第一响应者。按钮的响应事件方法为:
我们可以看到,这个时候下方的输入框成为第一响应者,并且触发了开始编辑事件,所以有两次打印。切换后,焦点也切换到第二个输入框中,我们通过键盘输入时,内容会在第二个输入框中出现。
时常有人碰到希望点击空白区域,隐藏键盘的问题。例如输入框输入一半,觉得不想再编辑了,可以点击空白区域来隐藏键盘,这个时候其实只需要告诉系统,这个第一响应者的位置我不想要了,我想辞职,这就够了!下面是点击第一个输入框后,然后点击空白区域,触发touchesBegin事件,最后topInputView辞职的过程,通过这种方式就可以隐藏键盘了。代码如下:
相关文章推荐
- 【iOS开发】事件处理之响应链(二)
- iOS-控件响应用户控制事件之事件处理
- iOS 按钮超过父视图范围无法响应事件的处理方法
- 事件处理指南(Event Handling Guide for iOS) 阅读笔记 (二) 响应链
- iOS中超出父视图的按钮点击事件响应处理
- iOS-控件响应用户控制事件之事件处理
- ios开发事件处理之:五:事件的响应
- UISearchController自动弹出键盘,调用becomeFirstResponder变为第一响应事件
- iOS触摸事件传递与响应链
- iOS——事件响应链
- Unity3D开发之NGUI点击事件穿透响应处理
- iOS事件处理---响应者链
- [iOS] UIButton 不响应或延迟响应 UIControlEventTouchDown 事件的解决办法
- iOS---自动处理键盘事件的第三方库:IQKeyboardManager
- iOS事件响应链中Hit-Test View的应用
- [iOS]如何在UIWebView中响应双击事件
- ios下Safari无法触发click事件的处理
- iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.
- java小程序中鼠标事件的响应处理(包含右键、双击等)
- IOS键盘响应及处理