IOS的事件处理--hitTest:withEvent:和PointInside:withEvent:是如何关联的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

文件上说,

在命中测试中,窗口调用hitTest:withEvent:在视图层次结构的最顶层视图上;此方法通过递归调用来进行。pointInside:withEvent:在返回YES的视图层次结构中的每个视图上,沿着层次结构继续下去,直到它找到在其范围内发生触摸的子视图。该视图将成为命中测试视图。

那么,这仅仅是这样吗?hitTest:withEvent:最顶层视图的调用是由系统调用的,该系统调用pointInside:withEvent:的所有子视图,如果从特定子视图返回的结果是肯定的,则调用pointInside:withEvent:子视图的子类?

提问于
用户回答回答于

执行hitTest:withEvent:在UIResponder中做了以下工作:

  • 它叫pointInside:withEvent:self
  • 如果回报是否定的,hitTest:withEvent:回报nil故事的结尾。
  • 如果返回是肯定的,则发送hitTest:withEvent:从顶层子视图开始,并继续到其他视图,直到子视图返回非-nil对象,或者所有子视图都接收消息。
  • 如果子视图返回非-nil对象在第一次,第一次hitTest:withEvent:返回那个对象,故事的结尾。
  • 如果没有子视图返回非-nil对象,第一个hitTest:withEvent:回报self

此过程递归地重复,因此通常视图层次结构的叶视图最终会被返回。

但是,可能会重写hitTest:withEvent做一些不同的事情。在许多情况下,重写pointInside:withEvent:更简单,并且仍然提供足够的选项来调整应用程序中的事件处理。

用户回答回答于

我认为混淆了子类化和视图层次结构。假设您有此视图层次结构。通过层次结构,我不是在谈论类层次结构,而是指视图层次结构中的视图,如下所示:

+----------------------------+
|A                           |
|+--------+   +------------+ |
||B       |   |C           | |
||        |   |+----------+| |
|+--------+   ||D         || |
|             |+----------+| |
|             +------------+ |
+----------------------------+

说你把手指插进去。下面是将要发生的事情:

  1. hitTest:withEvent:被召唤A视图层次结构的最顶层视图。
  2. pointInside:withEvent:在每个视图上递归调用。
    1. pointInside:withEvent:被召唤A,和回报YES
    2. pointInside:withEvent:被召唤B,和回报NO
    3. pointInside:withEvent:被召唤C,和回报YES
    4. pointInside:withEvent:被召唤D,和回报YES

  1. 关于返回的观点YES,它将向下查看层次结构,以查看触摸发生的子视图。在这种情况下,ACD,会是D
  2. D将是命中测试视图。

扫码关注云+社区