所有继承的响应者对象UIResponder都可以接收和处理事件。按照时间顺序,先找到最合适的view,然后调用view的touches方法。这些方法的默认方式是将事件沿响应链向上传递,将事件交给上一个响应者处理,直到有视图可以处理响应或丢弃响应。这是一个从上到下,再从下到上的过程。1.事件生成一个事件发生后,系统会将事件添加到一个由UIApplication管理的事件队列中。UIApplication会从事件队列中取出前端事件,分发事件进行处理。通常,事件首先发送到应用程序的主窗口(keywindow)。keywindow会在视图层级中寻找最合适的视图来处理事件。2.事件传递事件传递首先从父控件传递给子控件(UIApplication->window->找到最合适的view来处理事件)。如果父视图不能接收到触摸事件,那么子视图也不能接收到触摸事件。2.1如何找到最合适的视图处理事件判断keywindow自身是否接受事件判断事件是否在自身上遍历子视图数组中的子控件从后往前,重复前面的步骤1和2如果没有合适的子控件,那么你就是最合适的控件2.2找到最合适的view底层分析有两个重要的方法:hitTest:withEvent:pointInside:withEvent:view会调用hitTest:withEvent:方法,hitTest:withEvent:方法的底层会调用pointInside:withEvent:方法来判断触摸点是否在这个视图的坐标系中。如果它在坐标系中,事件将被调度到这个视图的子视图。然后对每个单词视图重复上述步骤,直到在顶层有一个合适的视图。3.事件响应事件响应会从最底层最合适的view开始,然后沿着上一步找到的链条逐层响应触摸事件。默认情况下,触摸事件会传递给上层。如果到达viewcontroller的view,就会传给viewcontroller。如果viewcontroller无法处理它,它将传递给UIWindow。如果UIWindow无法处理它,它将传递给UIApplication。如果UIApplication不能处理它,它将被传递给UIApplicationDelegate。如果UIApplicationDelegate无法处理它,该事件将被丢弃。
