iPhone 检测地图图像上的触摸
Posted
技术标签:
【中文标题】iPhone 检测地图图像上的触摸【英文标题】:iPhone detecting touches on a map image 【发布时间】:2009-08-02 18:20:58 【问题描述】:我有一张静态地图图像,上面有一堆描绘城市的圆圈和正方形。我已将图像加载到一个 imageView 中,该 imageView 是一个 scrollView 的子类,以便我可以捕获用户触摸并在地图上缩放/滚动。我的挑战是,每当用户触摸城市的这些圆圈/正方形之一时,我想弹出一个标签,告诉他们它是哪个城市,并可能加载该城市的详细视图。我想我可以根据 imageView 地图将城市的所有相关 CGPoints 预加载到字典中,这样我就可以在“touchesBegan”事件期间引用它们,但我很快就会陷入困境并可能会解决这个问题错误道。
到目前为止,一切正常,我可以捕获触摸的 CGPoint x 和 y 坐标。我遇到的最大问题是确定用户触摸与我在字典中可能有的离散点的接近程度。换句话说,如果字典有“Boston = NSPoint: 235, 118;”如何判断用户何时接近该点而不让他们重复触摸直到准确为止?是否有一种简单的方法可以确定用户触摸是否“接近”预先存在的点?我会以正确的方式解决这个问题吗?
欢迎任何建议或耳光。
谢谢,迈克
【问题讨论】:
【参考方案1】:您可以使用 UIButtons 来表示城市。然后,您将轻松获得标准的触摸、突出显示等行为。在地图上添加按钮作为子视图应该会使它们随地图缩放和滚动。
【讨论】:
我想过这个问题,但考虑到 50+ 城市积分,申报/管理这么多对象会很疯狂。感谢您的回复 - Mike。 虽然这看起来很疯狂,但您可以遍历您的字典,提取城市的点,创建一个大约 15 x 15 像素的新按钮,然后使用城市的点设置中心。您需要做的另一件事是将按钮连接到一个方法 (addTarget:action:forControlEvent:),并确保您有一种方法可以识别哪个按钮对应于哪个城市。一种方法是将按钮的 tag 属性设置为数组中城市的索引。 谢谢戴夫,这基本上就是我所做的。我遍历点字典进行复合 if 语句比较(+/- 10),然后当我找到公差范围内的点时,我从字典中提取城市名称并创建/显示带有城市名称的视图和一些用于用户操作的按钮。 - 再次感谢,迈克 感谢所有回复的人,我的解决方案已在上面发布,以响应 Dave 的建议。 - 迈克【参考方案2】:如果我理解正确,您想知道用户点击的点是否“足够接近”标记为城市的点。
您必须量化关闭,即设置一个阈值,在该阈值之后点击更远,在该阈值之前点击更近。
一旦你这样做了,计算笛卡尔坐标距离 sqrt ( (x1-x2)^2 + (y1-y2)^2) 对于数组中的每个元素(读取带有 x,y 城市值的字典)并将结果存储在另一个数组中。然后取结果的最小值。如果小于所述阈值,则该结果的索引是最接近水龙头的城市。
【讨论】:
【参考方案3】:您可以使用R-Tree,也可以计算触摸与当前视图中每个可见点的距离。要计算接近度,您通常会使用勾股定理,但在这种情况下,您可以跳过平方根,因为您只是在比较相对大小。如果您喜欢说 50 像素平方等于 2500,您也可以声明距离截断。因此,您可以将结果放入包含距离和参考点的对象中,并将对象放入 NSMutableArray 中,而不是在截断下添加结果,并且选择最小的结果。
所以如果你有一个接触点pT
,那么对于每个点pN
,你会计算:
d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance
具有最小值d
的点pN
是最接近pT
的点。就像我说的,如果你只想计算 10 像素内的触摸,你可以测试 d <= 10*10
;
在 20x20 的正方形区域内测试触摸的方法也有效,除非两个点彼此相距在 20 像素以内,那么您需要知道哪个是最近的触摸点。
【讨论】:
感谢您的建议,但我几乎不会拼写毕达哥拉斯,没关系理解它。你显然是聪明的孩子之一,而我是跳过数学的傻瓜之一。在带我的狗散步以清醒头脑之后,我实际上想到了一个解决方案,将触摸 x 和 y 坐标与存储的城市 x 和 y 坐标 +/- 10 点的字典进行比较。 if ( (touchPoint.y >= (mapPoint.y -10) && touchPoint.y = (mapPoint.x -10) && touchPoint.x以上是关于iPhone 检测地图图像上的触摸的主要内容,如果未能解决你的问题,请参考以下文章