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

尽管大多数Apple文档都写得很好,但我认为“ iOS事件处理指南 ”是一个例外。我很难清楚地了解那里的描述。


该文件说,


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


难道就好像系统只hitTest:withEvent:调用了最顶层的视图,即调用pointInside:withEvent:了所有子视图,并且如果特定子视图的返回值为YES,则pointInside:withEvent:该子视图的子类的调用一样?


HUX布斯
浏览 726回答 3
3回答

胡说叔叔

这似乎是一个基本的问题。但是,我同意您的要求,该文档不像其他文档那么清晰,所以这是我的答案。hitTest:withEvent:UIResponder中的实现执行以下操作:它调用pointInside:withEvent:的self如果返回为NO,则hitTest:withEvent:返回nil。故事的结尾。如果返回值为“是”,则它将hitTest:withEvent:消息发送到其子视图。它从顶层子视图开始,然后继续其他视图,直到子视图返回非nil对象,或者所有子视图都收到消息。如果子视图nil第一次返回非对象,则第一个hitTest:withEvent:返回该对象。故事的结尾。如果没有子视图返回非nil对象,则第一个hitTest:withEvent:返回self此过程以递归方式重复,因此通常最终返回视图层次结构的叶视图。但是,您可能会覆盖hitTest:withEvent以执行其他操作。在许多情况下,覆盖pointInside:withEvent:更为简单,并且仍然提供足够的选项来调整应用程序中的事件处理。

森林海

我认为您在将子类与视图层次结构混淆。该文档说的如下。假设您具有此视图层次结构。通过层次结构,我不是在谈论类层次结构,而是在视图层次结构中的视图,如下所示:+----------------------------+|A                           ||+--------+   +------------+ |||B       |   |C           | |||        |   |+----------+| ||+--------+   ||D         || ||             |+----------+| ||             +------------+ |+----------------------------+假设您将手指放在里面D。将会发生以下情况:hitTest:withEvent:A在视图层次结构的最顶层视图上调用。pointInside:withEvent: 在每个视图上递归调用。pointInside:withEvent:被调用A,并返回YESpointInside:withEvent:被调用B,并返回NOpointInside:withEvent:被调用C,并返回YESpointInside:withEvent:被调用D,并返回YES在返回的视图上YES,它将向下查看层次结构以查看发生触摸的子视图。在这种情况下,从A,C并且D,这将是D。D 将成为热门测试视图
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS