参考好文
iOS开发-事件传递响应链,用运行时分析
iOS事件传递:响应者链[译]
//www.greatytc.com/p/ef83a798121c
图都是搬过来总结的
总结
- 操作系统会把一系列单击事件包装成UITouch和UIEvent形式的实例。
图中的都是UIResponder的子类对象。
UIResponer提供四个用户点击的回调方法
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后依旧未响应,事件被摒弃为止
响应者链是由一系列响应者连成的链
- 很多类型的事件的传递都依赖于响应者链。响应者链是一系列连接在一起的响应者对象。它从第一响应者(栈顶的view)开始,以application
对象结束。如果第一响应者不能处理这个事件,它会把这个事件沿着这个响应者链传递到下一个响应者。 - 一个响应者对象是一个能响应并能处理事件的对象。UIResponder类是所有响应者的父类,它定义了事件处理和常见响应者行为的通用编程接口。UIApplication,UIViewController以及UIView类的实例对象都是响应者,这表明,所有视图和绝大多数主控制器都是响应者。需要注意的是核心动画的图层对象不是响应者。