点击View E出发事件为例。
iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view。
1 View A 是UIWindow的根视图,如果该点击事件不在View A范围内,UIWindow调用的hitTest:withEvent: 返回nil,
2 反之在该范围内,hitTest:withEvent:则调用其视图结构层级所有子视图的pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图,击的范围不再A内,因此A的pointInside:withEvent:返回NO,对应的hitTest:withEvent:返回nil,点击的范围在A内,即A的pointInside:withEvent:返回YES)
3 View A的pointInside:withEvent:返回YES,则向当前视图(View A)的所有子视图(View B和View C)发送hitTest:withEvent:消息,点击的范围不再B内,因此B分支的pointInside:withEvent:返回NO,对应的hitTest:withEvent:返回nil;点击的范围在C内,即C的pointInside:withEvent:返回YES。同理,直至找到View E,则hitTest:withEvent:方法返回自身(self).