事件响应链,包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下至上传播。可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。
1> 首先解释响应者链的概念
UIResponder类,是UIKit中一个用于处理事件响应的基类。窗口上的所有事件触发,都有该类响应(即事件处理入口)。所以,窗口上的view及控制器都是派生于该类的。开入UIView。UIViewController等。调用UIResponder类提供的方法或属性,我们就可以捕捉到窗口上所以得响应事件的对象,所有的view和viewcontroller都是响应者对象,利用响应者链条能让多个控件处理同一个触摸事件。
2>事件传递机制
如果当前view不能处理当前事件,那么事件将会沿着响应者链(Responder Chain)进行传递,直到遇到能处理该事件的响应者。
1)接收事件的initial view如果不能处理改事件,边切她不是顶层的view,则事件会往她的父view进行传递。 2)initial view的父view获取事件后如果仍不能处理,则继续往上传递,循环这个过程。如果顶层的view还是不能处理这个事件的话,则会将事件的触底给他们的viewcontroller。 3)如果viewcontroller也不能处理,则传递给window,此时window不能处理的话就将事件传递UIApplication,最后如果连Application也不能处理,则废弃该事件。
如果可以处理
通过事件传递找到最合适的处理触摸事件的view后(就是最后一个pointInside返回YES的view,它是第一响应者),如果该view是控制器view,那么上一个响应者就是控制器。如果它不是控制器view,那么上一个响应者就是前面一个pointInside返回YES的view(其实就是它的父控件)。 最后这些所有pointInside返回YES的view加上它们的控制器、UIWindow和UIApplication共同构成响应者链条。响应者链条是自上而下的(我把window上最外面的那个view称为上),前面的事件传递是自下而上的。
响应者链条的作用
可以让一个触摸事件让多个响应者同时处理该事件。
能够在多个view内打印出touchBegan就是利用了此作用,
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"touchBegan---%@", [self class]);
[super touchesBegan:touches withEvent:event];
}
最大的view先执行 , 倒序遍历的子控件再依次执行同名的方法。