hitTest

作者: 小凡凡520 | 来源:发表于2019-02-19 23:02 被阅读0次
    背景

    发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理。通常,会先发送事件给应用程序的keyWindow,主窗口会在其视图层次结构中找到一个最合适的视图来处理触摸事件,这个找寻的过程就是事件传递

    hitTest是什么

    hitTest:withEvent:是UIView的一个方法,该方法会被系统调用,是用于在视图(UIView)层次结构中找到一个最合适的UIView来响应触摸事件。

    hitTest的调用顺序
    touch->UIApplication->UIWindow->UIViewController.view->subViews->...->view
    
    实例
    595405-bd72d7b08f8de1db.png
    点击了绿色的view:UIApplication -> UIWindow -> 白色 -> 绿色
    点击了蓝色的view:UIApplication -> UIWindow -> 白色 -> 橙色 -> 蓝色
    点击了红色的view:UIApplication -> UIWindow -> 白色 -> 橙色 -> 红色
    
    事件传递过程
    1.keyWindow会在它的内容视图上调用hitTest:withEvent:(该方法返回的就是处理此触摸事件的最合适view)来完成这个找寻过程
    2.hitTest:withEvent:在内部首先会判断该视图是否能响应触摸事件,如果不能响应,返回nil,表示该视图不响应此触摸事件。然后再调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内)。如果pointInside:withEvent:返回NO,那么hiteTest:withEvent:也直接返回nil
    3.如果pointInside:withEvent:返回YES,则向当前视图的所有子视图发送hitTest:withEvent:消息,所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历。直到有子视图返回非空对象或者全部子视图遍历完毕
    4.若第一次有子视图返回非空对象,则 hitTest:withEvent:方法返回此对象,处理结束;如所有子视图都返回非,则hitTest:withEvent:方法返回该视图自身

    相关文章

      网友评论

          本文标题:hitTest

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