【发布时间】:2011-12-09 19:53:23
【问题描述】:
我是 iPhone 开发的新手,
鉴于以下map。每当我选择像“西澳大利亚”这样的特定部分时,我都想引发一个触摸事件。但是那个特定区域不是方形或圆形,更不用说触摸区域了。边界没有顺序。我怎样才能得到那个触摸事件?
请任何人指导我或给我一个教程如何使用该部分?
【问题讨论】:
标签: iphone objective-c cocoa-touch ios4
我是 iPhone 开发的新手,
鉴于以下map。每当我选择像“西澳大利亚”这样的特定部分时,我都想引发一个触摸事件。但是那个特定区域不是方形或圆形,更不用说触摸区域了。边界没有顺序。我怎样才能得到那个触摸事件?
请任何人指导我或给我一个教程如何使用该部分?
【问题讨论】:
标签: iphone objective-c cocoa-touch ios4
在您的链接地图中,您可以看到每个区域由多边形定义,由顶点数组表示。 (如果您没有看到这个,请查看 html 源代码,然后您就会看到它。)您可以在 Internet 上找到很多关于可以确定点是否在以这种方式描述的多边形内的算法的讨论。 Here is one discussion that may be worth looking at,在您对它的长度感到气馁(它非常彻底)之前,请查看标题为 The "Crossing Count" Algorithm 的部分。与我见过的其他一些方法相比,这是一种非常简单的方法。它归结为确定它的线相交并计算多边形的多少条边与一条射线相交。
您需要检查每个多边形的接触点,直到找到它在里面。可能值得做的一件事是首先检查触摸点是否在边界框内,边界框由每个多边形顶点数组的最小 x、最大 x、最小 y 和最大 y 值定义。如果不在边界框内,则不在多边形内。
至于检测触摸事件及其位置,look at my answer to this question,它告诉如何确定触摸发生在屏幕上的哪个位置(使用 touch:locationInView:)。
我不知道您是否打算放大和缩小图像,但这会给您的操作增加一些复杂性。如果此回复没有太大帮助,您能否提供有关您正在尝试做的事情的更多信息?
【讨论】:
有几种选择,但只有一种比较容易实现。
首先,您将无法使用 UIButtons 等常规控件完成此操作 - 相反,您需要自己处理触摸事件。
-1- 彩色区域;你的地图是彩色的,所有可点击的区域都显示不同的颜色。
在这种情况下,您需要做的就是检查触摸点下方的像素的颜色。类似的事情是在这个example 中完成的。
-2- 自定义触摸图;几何对象的地图,最好是三角形。
您可以创建某种由三角形组成的叠加图。可能大小不一。该地图上的所有三角形都链接到一个区域。每当用户触摸您的地图时,您就会运行碰撞检测。有关简单 2D 点到多边形碰撞的详细信息,请查看this article at topcoder。
【讨论】:
@Jim 就通用的可移植算法提供了极好的建议。但是,由于您使用的是 iPhone,因此将地图信息转换为 UIBezierPath 对象可能会很方便。有关如何创建此类路径对象的详细信息,请参阅Drawing and Printing Guide。然后您可以使用[UIBezierPath containsPoint:] 为您进行命中测试。如果您想要与网页相同的效果,拥有路径对象还可以方便地进行突出显示。
【讨论】: