2

我的主视图有几个(可能很多)多边形活动区域,它们实现为子视图。当用户触摸视图时,我想确定她是否点击了这些活动区域之一。

有什么比一个简单的算法更好的方法来遍历所有 [可能*] 活动区域的列表并询问它们中的每个点是否在其中?

我不能使用(不覆盖它)hitTest:withEvent:,因为它的文档指出“此方法忽略隐藏的、禁用用户交互或 alpha 级别小于 0.01 的视图对象。”。而且我的子视图确实是隐藏的(大部分时间)。

我可以看到这些选项:

  • 实现我自己成熟的四叉树实现。这有点过早优化的味道,这是在重新发明轮子,因为我希望 Apple 的命中测试实现已经得到优化

  • 通过保持每个最大和最小 x 和 y 坐标来限制 [可能*] 区域,并首先在该矩形上进行命中测试。事实上,我的子视图frame 就是那些矩形。我希望 Apple 的命中测试能够使用这些。

  • 在我的子视图中覆盖 Cocoa TouchhitTest:withEvent:以删除记录的限制。希望这不会对我的应用程序产生不利影响(例如,我可以忽略子视图上的任何虚假触摸事件,或者将它们转发到我的主视图)。

  • 天真并相信用户永远不会在实际使用中添加太多活动区域,以免天真的算法执行得太差。

有什么建议吗?

请注意,多边形总是简单的,但不一定是凸的。此外,我使用的最精确的命中测试是使用 Quartz 例程CGPathContainsPoint

4

0 回答 0