iOS事件处理---响应者链

来源:互联网 发布:mac切换输入法快捷方式 编辑:程序博客网 时间:2024/05/16 18:42

一、响应链的定义(Responder Chain)以及作用、第一响应者

  响应者链就是由一系列的响应者对象(响应和处理事件能力的对象)构成的一个层次结构 (或者链条)。它的作用是能让多个控件处理同一个触摸事件。

  第一响应者(First responder)指的是当前接受触摸的响应者对象(通常是一个UIView对象),即表示当前该对象正在与用户交互,它是响应者链的开端。整个响应者链和事件分发的重点就是找第一响应者。

二、事件传递的详细过程:

1.找到合适的UIView:

1.1  iOS App检测到手指触摸操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列。单例的UIApplication会从事件队列中取出触摸事件并传递给UIWindow来处理

1.2  UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图。UIWindow实例对象会首先在它的内容视图上调用hitTest:WithEvent:,此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:,如果返回YES,则逐级递归调用,直到找到touch操作发生的位置。

处理流程如下:

1   调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内。

2   返回NO,则hitTest:withEvent:返回nil;若返回YES,则向当前视图的所有子视图发送hitTest:withEvent:消息,从最顶层视图一直到最底层视图即从subviews数组的末尾向前遍历,知道有子视图返回非空对象或者全部子视图遍历完。

3 若有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束。如所有子视图都返回nil,则返回自身(self)。

如下图1所示:


图1 

2.UIView处理触摸事件

根据第一步找到最合适的UIView控件来处理触摸事件。该控件调用touches方法,如果调用了[super touches....]方法,就会将事件顺着响应链往上传递,传递给上一个响应者,接着就会调用上一个响应者的touches方法(与消息发送机制类似)。

3.如何判断上一个响应者(图2所示)


图2

如果当前view是控制器的view,那么控制器就是上一个响应者。如果当前这个view不是控制器的view,那么父控件就是上一个响应者。

三:注意事项

1.hitTest:withEvent:方法将会忽略(hidden=YES)的视图,禁止用户操作(userInteractionEnabled=YES)的视图以及alpha小于0.01的视图。

2.如果一个子视图的区域超过父视图的bound区域(父视图的clipsToBounds属性为NO,超过父视图bound区域的子视图内容也会显示),那么正常情况下对子视图之外的区域的触摸操作不会被识别,就不会继续向下遍历子视图。


参考apple官方文档:
https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html#//apple_ref/doc/uid/TP40009541-CH4-SW1


0 0
原创粉丝点击