iOS事件传递及响应者链条

在iOS中只有继承UIResponder的对象才能够接收并处理事件,UIResponder 是所有响应对象的基类,在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的 UIApplication、 UIViewController、 UIWindow 和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象,首先我们通过一张图来简单了解一下事件的传递以及响应.

1.响应者链条

响应者链条就是由多个响应者对象连接起来的链条,它的作用就是让我们能够清楚的看见每个响应者之间的联系,并且可以让一个时间多个对象处理.

2.响应过程

iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图(最合适来处理的控件),这个过程称之为hit-test view。

那么什么是最适合来处理事件的控件?

(1)自己能响应触摸事件

(2)触摸点在自己身上

(3)从后往前递归遍历子控件, 重复上两步

(4)如果没有符合条件的子控件, 那么就自己最合适处理

3.两个重要的响应方法(UIView的)

(1)hit-test view:事件传递给控件的时候, 就会调用该方法,去寻找最合适的view并返回看可以响应的view


(2)pointInside: 该方法判断触摸点是否在控件身上,是则返回YES,否则返回NO,point参数必须是方法调用者的坐标系.


4、传递方向

1.事件的传递方向: 事件传递是从上自下传递,响应是从下到上,所谓的上就是父视图而已,也就是离窗口最近的.

2.穿透控件:

2.1 如果我们不想让某个视图响应事件,只需要重载 PointInside:withEvent:方法,让此方法返回NO就行了.

2.2 若是view上有view1,view1上有view2,点击view2,view2自己响应,点击view1,view1不响应,只有view响应,也就是隔层传递


你可能感兴趣的:(iOS事件传递及响应者链条)