美文网首页
iOS事件响应链Hit-Test View

iOS事件响应链Hit-Test View

作者: 移动端技术 | 来源:发表于2018-10-28 12:49 被阅读0次

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调用顺序检测

Simulator Screen Shot - iPhone XR - 2018-10-28 at 11.01.05.png Snip20181028_1.png

Hit-Test View应用举例

扩大UIButton的点击范围

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


Simulator Screen Shot - iPhone XR - 2018-10-28 at 12.40.19.png Snip20181028_5.png Snip20181028_6.png
子视图超出父视图部分的响应事件
Simulator Screen Shot - iPhone XR - 2018-10-28 at 12.43.35.png Snip20181028_7.png
父视图包裹子视图,将父视图的所有区域事件传递给子视图
Snip20181028_10.png

相关文章

网友评论

      本文标题:iOS事件响应链Hit-Test View

      本文链接:https://www.haomeiwen.com/subject/fxjptqtx.html