系统响应阶段

1、手指触摸屏幕之后,屏幕感应到触碰,然后将响应交由IOKit处理。
2、IOKit将触摸事件封装成一个IOHIDEvent对象,并通过mach port传递给SpringBoard进程。
3、SpringBoard进程因接收到触摸事件,触发主线程runloop的source1事件源的回调。然后判断当前是在什么情况下,桌面情况下传递给桌面进程,app前台的话将触摸事件传递给前台APP进程。

app响应阶段

1、app进程runloop接收到传递过来的触摸事件,触发source1回调,在source1中触发source0回调,将接收到的IOHIDEvent对象转化成UIEvent对象,此时APP将正式对触摸事件开始响应。
2、source0回调里面会将触摸事件添加到UIApplication对象的事件队列中,事件出队之后,UIApplication开始寻找最佳响应者的过程。
3、寻找到最佳响应者之后,接下来便是事件在响应链中传递以及响应了。
4、触摸事件要么被某个响应对象捕获后释放,要么没有找到响应对象被释放。

寻找事件的最佳响应者

hit—Testing
application -> window -> rootview -> ... -> subview
通过递归逐级通过hitTest:withEvent方法寻找触碰点所在的视图,如果当前view的方法返回yes,从后向前遍历subviews,直到找到最佳响应者为止。

响应

然后view的控制器存在,传递给控制器响应,如果不存在传递给父视图。
如果在最顶层视图依旧不能收到事件或消息,那么传递给window对象。
如果window对象也不处理则传递给application对象。
如果application对象不能处理,那么被丢弃。

优先级

手势识别器比UIResponder具有更高的事件响应优先级。
而UIControl则拥有最高级别的优先级。