美文网首页
hitTest:withEvent:调用过程

hitTest:withEvent:调用过程

作者: anna_hui | 来源:发表于2018-01-16 09:34 被阅读0次

iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件的窗口)处理,window对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,称之为hit-test view。

window对象会在首先在view hierarchy的顶级view上调用hitTest:withEvent:,此方法会在视图层级结构中的每个视图上调用pointInside:withEvent:,如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是hit-test view。

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

1. 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;
2. 若返回NO,则hitTest:withEvent:返回nil;
3. 若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从top到bottom,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;
4. 若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;
5. 如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。

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

对于每个触摸操作都会有一个UITouch对象,UITouch对象用来表示一个触摸操作,即一个手指在屏幕上按下、移动、离开的整个过程。UITouch对象在触摸操作的过程中在不断变化,所以在使用UITouch对象时,不能直接retain,而需要使用其他手段存储UITouch的内部信息。UITouch对象有一个view属性,表示此触摸操作初始发生所在的视图,即上面检测到的hit-test view,此属性在UITouch的生命周期不再改变,即使触摸操作后续移动到其他视图之上。

实现

强制指定某视图响应触摸事件:
忽略指定的视图:
定制触摸事件的响应范围
超出父视图范围响应

相关文章

  • hitTest:withEvent:调用过程

    iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIApplica...

  • hitTest:withEvent:调用过程

    一.hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动A...

  • hitTest:withEvent:方法流程

    一.hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动A...

  • hitTest:withEvent

    此方法可实现点击穿透、点击下层视图功能。 一. hitTest:withEvent:调用过程 iOS系统检测到手指...

  • iOS UIView的事件传递与响应链

    事件传递过程 点击屏幕->UIApplication->UIWindow->hitTest:withEvent:-...

  • hitTest笔记

    hitTest:withEvent:方法的处理流程如下: 首先调用当前视图的pointInside:withEve...

  • 定制hitTest:withEvent:方法

    hitTest:withEvent:方法的处理流程如下: 首先调用当前视图的pointInside:withEve...

  • hitTest和pointInside方法

    hitTest: withEvent:方法 事件传递的时候调用 当事件传递给控件的时候,就会调用控件的这个方法,去...

  • iOS 事件传递和事件响应

    关键点:hitTest:withEvent方法的底层实现 总结几个点 1、在hitTest:消息分发过程中,并不是...

  • hitTest:withEvent:

    按钮无法点击 如果在UIImageView中添加了一个按钮,你会发现在默认情况下这个按钮是无法被点击的,需要设置U...

网友评论

      本文标题:hitTest:withEvent:调用过程

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