为了账号安全,请及时绑定邮箱和手机立即绑定

iOS的事件处理-hitTest:withEvent:和pointInside:withEvent:

iOS的事件处理-hitTest:withEvent:和pointInside:withEvent:

iOS
HUX布斯 2019-10-14 10:13:51
尽管大多数Apple文档都写得很好,但我认为“ iOS事件处理指南 ”是一个例外。我很难清楚地了解那里的描述。该文件说,在命中测试中,一个窗口调用hitTest:withEvent:视图层次结构的最顶层视图。此方法通过递归地调用pointInside:withEvent:返回YES的视图层次结构中的每个视图来进行,然后继续进行下去,直到找到发生触摸的子视图。该视图将成为命中测试视图。难道就好像系统只hitTest:withEvent:调用了最顶层的视图,即调用pointInside:withEvent:了所有子视图,并且如果特定子视图的返回值为YES,则pointInside:withEvent:该子视图的子类的调用一样?
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

这似乎是一个基本的问题。但是,我同意您的要求,该文档不像其他文档那么清晰,所以这是我的答案。


hitTest:withEvent:UIResponder中的实现执行以下操作:


它调用pointInside:withEvent:的self

如果返回为NO,则hitTest:withEvent:返回nil。故事的结尾。

如果返回值为“是”,则它将hitTest:withEvent:消息发送到其子视图。它从顶层子视图开始,然后继续其他视图,直到子视图返回非nil对象,或者所有子视图都收到消息。

如果子视图nil第一次返回非对象,则第一个hitTest:withEvent:返回该对象。故事的结尾。

如果没有子视图返回非nil对象,则第一个hitTest:withEvent:返回self

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


但是,您可能会覆盖hitTest:withEvent以执行其他操作。在许多情况下,覆盖pointInside:withEvent:更为简单,并且仍然提供足够的选项来调整应用程序中的事件处理。


查看完整回答
反对 回复 2019-10-14
?
森林海

TA贡献2011条经验 获得超2个赞

我认为您在将子类与视图层次结构混淆。该文档说的如下。假设您具有此视图层次结构。通过层次结构,我不是在谈论类层次结构,而是在视图层次结构中的视图,如下所示:


+----------------------------+

|A                           |

|+--------+   +------------+ |

||B       |   |C           | |

||        |   |+----------+| |

|+--------+   ||D         || |

|             |+----------+| |

|             +------------+ |

+----------------------------+

假设您将手指放在里面D。将会发生以下情况:


hitTest:withEvent:A在视图层次结构的最顶层视图上调用。

pointInside:withEvent: 在每个视图上递归调用。

pointInside:withEvent:被调用A,并返回YES

pointInside:withEvent:被调用B,并返回NO

pointInside:withEvent:被调用C,并返回YES

pointInside:withEvent:被调用D,并返回YES

在返回的视图上YES,它将向下查看层次结构以查看发生触摸的子视图。在这种情况下,从A,C并且D,这将是D。

D 将成为热门测试视图


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 725 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信