1:iOS系统检测到手指触摸(Touch)操作 -> 打包成一个UIEvent对象 -> 放入当前活动Application的事件队列 -> 传递给单例的UIWindow来处理 -> UIWindow通过响应者链的事件分发机制找到第一响应者(如下图步骤所示)
图二
加入用户点击了View E,下面结合图二介绍hit-test view的流程:
1、A是UIWindow的根视图,因此,UIWindwo对象会首相对A进行hit-test;
2、显然用户点击的范围是在A的范围内,因此,pointInside:withEvent:返回了YES,这时会继续检查A的子视图;
3、这时候会有两个分支,B和C:
点击的范围不再B内,因此B分支的pointInside:withEvent:返回NO,对应的hitTest:withEvent:返回nil;
点击的范围在C内,即C的pointInside:withEvent:返回YES;
4、这时候有D和E两个分支:
点击的范围不再D内,因此D的pointInside:withEvent:返回NO,对应的hitTest:withEvent:返回nil;
点击的范围在E内,即E的pointInside:withEvent:返回YES,由于E没有子视图(也可以理解成对E的子视图进行hit-test时返回了nil),因此,E的hitTest:withEvent:会将E返回,再往回回溯,就是C的hitTest:withEvent:返回E--->>A的hitTest:withEvent:返回E。
2:如果没有找到第一响应者,则当前视图通过响应者链向上回溯至UIWindow和UIApplication,如果二者都不能处理该事件,则该事件将会被丢弃
原文地址:http://blog.csdn.net/niejiafa_131/article/details/46455779