iOS响应者链

参考好文

iOS开发-事件传递响应链,用运行时分析

iOS事件传递:响应者链[译]

http://www.jianshu.com/p/ef83a798121c
图都是搬过来总结的

总结

  1. 操作系统会把一系列单击事件包装成UITouch和UIEvent形式的实例。
iOS响应者链_第1张图片
事件响应链

图中的都是UIResponder的子类对象。
UIResponer提供四个用户点击的回调方法


iOS响应者链_第2张图片
屏幕快照 2016-08-12 下午3.53.58.png

UIVIew中的两个方法

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;   // default returns YES if point is in bounds

上面四个方法 + 2个方法有什么联系呢

当一个点击事件发生时,从UIApplication开始调用pointInSide: WithEvent:直到最低层的UIVIew,若返回YES,则调用hitTest: withEvent:,压入response栈,遍历到最低层UIView后,开始出栈 (使用nextResponder),每pop一个检测是否响应事件,以此下去,直到事件得到了处理或者到达AppDelegate后依旧未响应,事件被摒弃为止

iOS响应者链_第3张图片
屏幕快照 2016-08-12 下午4.20.33.png
iOS响应者链_第4张图片
屏幕快照 2016-08-12 下午4.20.53.png

响应者链是由一系列响应者连成的链

  • 很多类型的事件的传递都依赖于响应者链。响应者链是一系列连接在一起的响应者对象。它从第一响应者(栈顶的view)开始,以application
    对象结束。如果第一响应者不能处理这个事件,它会把这个事件沿着这个响应者链传递到下一个响应者。
  • 一个响应者对象是一个能响应并能处理事件的对象。UIResponder类是所有响应者的父类,它定义了事件处理和常见响应者行为的通用编程接口。UIApplication,UIViewController以及UIView类的实例对象都是响应者,这表明,所有视图和绝大多数主控制器都是响应者。需要注意的是核心动画的图层对象不是响应者

你可能感兴趣的:(iOS响应者链)