美文网首页
hitTest:withEvent

hitTest:withEvent

作者: 一代骄马 | 来源:发表于2017-09-25 16:53 被阅读39次

    此方法可实现点击穿透、点击下层视图功能。

    一. hitTest:withEvent:调用过程

    iOS系统检测到手指触摸(Touch)操作时,会将其放入当前活动Application的事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件的窗口)处理,

    window对象会在首先在view hierarchy的顶级view上调用hitTest:withEvent:

    hitTest:withEvent:方法的处理流程如下:

    首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;

    若返回NO,则hitTest:withEvent:返回nil;

    若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从top到bottom,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;

    若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;

    如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。

    hitTest:withEvent:方法忽略隐藏(hidden=YES)的视图,禁止用户操作(userInteractionEnabled=YES)的视图,以及alpha级别小于0.01(alpha<0.01)的视图。如果一个子视图的区域超过父视图的bound区域(父视图的clipsToBounds 属性为NO,这样超过父视图bound区域的子视图内容也会显示),那么正常情况下对子视图在父视图之外区域的触摸操作不会被识别,因为父视图的pointInside:withEvent:方法会返回NO,这样就不会继续向下遍历子视图了。当然,也可以重写pointInside:withEvent:方法来处理这种情况。

    相关文章

      网友评论

          本文标题:hitTest:withEvent

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