概述
响应链是支撑app界面交互的基础,点击,滑动,旋转,摇晃背后都离不开响应链。
触发一次事件时,系统会将事件Event放到事件队列中,由UIApplication从队列中取得这个Event。
响应者
- 寻找事件的响应者是通过
hitTest
和pointInside
完成的 -
hitTest
调用顺序从UIWindow开始,对子视图一次调用 - 遍历直到找到响应视图,逐级返回最终到UIWindow返回此视图
处理者
UIResponder主要有4个方法来处理事件:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
如果Responder没有处理事件,事件会被传递。下个传递给该对象的nextResponder。如果都没有处理事件,事件被丢弃。
响应者链一直传递到AppDelegate:
- 找到响应者视图后事件会从此视图开始沿着响应者链nextResponder传递,直到找到处理事件的视图,没有则被丢弃。
- 如果视图有父视图,则nextResponder指向父视图,如果是根视图则指向控制器。最终指向AppDelegate。