iOS事件响应链Hit-Test View
Hit-Test View的大致理解
官方文档:
The lowest view in the view hierarchy that contains the touch point becomes the hit-test view.
系统API:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- point: 在接收器的局部坐标系中指定的点;
- event: 系统保证调用此方法的事件,如果从事件处理代码外部调用此方法,则可以指定nil;
- rerurnValue: 视图对象是当前视图和包含点的最远的后代,如果点完全位于接收方的视图层次结构之外,则返回nil;
hiitest:withEvent:是UIView里面的一个方法,该方法的作用在于在视图的层次结构中寻找一个最适合的view来响应触摸事件.
大致理解:
当用户点击了屏幕的上的某个视图(view),这个动作用硬件层传导到操作系统,然后又从底层封装成一个事件(Event)顺着view的层级往上传导,系统通过调用hiitest:withEvent:进行查找,如果放回nil即该事件可能被丢弃,否则返回最适合的view来响应事件.
Hit-Test View的调用顺序
touch -> UIApplication -> UIWindow -> UIViewController.view -> subViews -> ....-> 合适的view
Hit-Test View的事件传递顺序
事件传递顺序恰好与hitTest的调用顺序相反
view -> superView ...- > UIViewController.view -> UIViewController -> UIWindow -> UIApplication -> 事件丢弃
pointInside简单介绍
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
在touch事件中,当事件从下往上逐层传到时,通过该方法进行取舍.在多个subviews中,如其在该touch的点击范围内,则返回Yes,继续遍历,如返回NO,则停止在该视图下继续遍历,然后在调用hitTest得到最喝水的view.
hitTest调用顺序检测


Hit-Test View应用举例
扩大UIButton的点击范围
项目中,经常对一个按钮添加一张图片,但此时按钮的尺寸就无法设置的太大,可是在点击时几乎无法准确点击到该按钮,这是我们就可以利用hitTest进行按钮点击区域的扩大.



子视图超出父视图部分的响应事件


父视图包裹子视图,将父视图的所有区域事件传递给子视图
