iOS 中事件的响应链和传递链

2.事件传递图示

如果想让某个view不能处理事件(或者说,事件传递到某个view那里就断了),那么可以通过刚才提到的三种方式。比如,设置其userInteractionEnabled = NO;那么传递下来的事件就会由该view的父控件处理。
流程描述:
- 我们点击屏幕产生触摸事件,系统会将这个事件加入到一个由UIApplication管理的事件队列中,UIApplication会从消息队列里取事件分发下去,首先传给UIWindow
- 在UIWindow中就会调用 hitTest:withEvent: 方法去返回一个最终响应的视图
- 在hitTest:withEvent方法中就会去调用第二个方法 pointInside:withEvent: 去判断当前点击的point是否在UIWindow范围内,如果是的话,就会去遍历它的子视图来查找最终响应的子视图。
下面通过一个比较直观的图形来讲述上面的规则

假设用户点击了视图D:
- 检测到点击坐标在View A范围之内。
- 继续检测点击范围是否在其子视图B,C范围内。发现点击范围在视图C范围内,则忽略掉B视图及其子视图分支。
- 继续检测点击范围是否在其子视图D范围内,如果是,则用户当前视图即为视图D。如果不是,继续检测其子视图。
- 总结:iOS系统会从父视图向子视图依次查找,直到找到点击范围在当前视图边界范围以内。如果点击范围在某子视图范围内,并且没有了子视图,则该视图即为当前点击视图。如果点击范围在某子视图范围之内,并且不在其子视图范围之内,则点击视图即为当前点击视图。

浙公网安备 33010602011771号