如何有效地找到rect @ some x,y点用iphone sdk
我正在寻找一种有效的方式来处理来自触摸方法的图像/帧检测。假设我正在构建一个键盘或类似的东西。我在UI上放置了n个图像。当有人触摸字母表(这是一个图像),我可以做以下检测相应的字母如何有效地找到rect @ some x,y点用iphone sdk
1)CGRectIntersectsRect(..,..):如果我使用这个,那么我需要检查每个&每来找出在那个接触点上存在什么字母(比方说100,100)。这变成了O(n)。如果我在屏幕上移动手指,那么我将得到m个点&所有对应的图像检测都变为O(n * m),这是不好的。
2)其他方法是为每个x,y位置的每个&构建一个散列,以便查找将简单地为O(1)。但是,这也将是一个内存约束,因为我需要存储300 * 300(假设我使用的是300 * 300的屏幕尺寸)。如果我重新洗牌我的信件,那么一切都需要再次计算。所以这是不好的
换句话说,我需要一些东西,给定一个点(x,y),我需要一些方法来找到哪个矩形有效地覆盖该点。
对不起,对于长帖&任何帮助将不胜感激。
谢谢
看看UIView的标签属性。如果您的图像位于UIView或UIView的子视图中,那么您可以设置每个标签并使用该标签在数组中查找。
如果没有,那么您可以通过将矩形数组划分为适合更大矩形的集合来提高速度。先测试外部矩形,然后测试内部矩形。 25个矩形只需要10次测试,最坏的情况是5套5个。
如果有一个规则的网格,然后整数除以网格大小。假设你有一个固定的屏幕尺寸,一个桶阵列给出了类似的增益(一个2D网格,其中每个条目是与该网格部分相交的矩形的列表)非常快,如果调整正确,那么只有列表有几个成员。对于无界或大空间,可以使用KD树。
如果您希望将最终目标作为子视图设置为较大的UIView
(或子类),并且您期望发生所有这些相关匹配,则这很有用。例如,如果您构建自己的键盘,则可以添加一堆UIButton
对象作为子视图并对其进行测试。
因此,轻松和传统的测试一堆子视图的方法是简单地让用户点击这些按钮触发代码。例如,您可以将子视图添加为UIControl
对象(这是UIView
的子类,它添加了一些用于捕获用户触摸事件的有用方法),并且调用addTarget:action:forControlEvents:
来指定某些方法在用户在该方法中执行某些操作时触发UIControl
。例如,您可以捕获诸如UIControlEventTouchDown
或UIControlEventTouchDragEnter
之类的内容。您可以阅读the UIControl
class reference中的完整列表。
现在,这听起来像你可能正在寻找更加自定义的东西。如果你真的想从一个随机(x,y)坐标开始,知道它在哪个矩形中,你也可以使用the hitTest:withEvent:
method of UIView
。该方法在视图中占据一个点,并查找包含该点的最详细的(层次结构中最低的)子视图。
如果你想利用这些子视图纯粹是为了命中测试,而不是用于显示,那么你可以设置自己的背景色[UIColor clearColor]
,但丝毫不掩饰他们(即设置hidden
属性YES
),禁用与用户的交互他们(通过userInteractionEnabled
BOOL属性),或者将alpha设置为低于0.1,因为任何这些东西都会导致hitTest:withEvent:
方法跳过该子视图。但是,只要符合这些标准,您仍然可以在此方法调用中使用不可见的子视图。
感谢皮特柯克姆&泰勒为你的答案,这是真正有帮助的。可以说,我不想使用按钮,因为我主要是将图像显示为小矩形。要检查的矩形@(X,Y)中,i可以通过使我的网格,发现
的GridColumn = Math.floor(pos.x/cellwidth)的正方形&触发容易; gridrow = Math.floor(pos.y/cellheight);
但我的问题是与touchesMoved。比方说,我开始@ grid-1 &拖动到grid-9(在3 * 3矩阵中),在这种情况下,我假设我将获得100-300(x,y)的位置,所以每次我需要运行在上面公式来确定相应的网格。这导致300次计算可能会影响性能。
所以,当我显示一个图像作为rect,我可以关联该图像的一些ID?这样我就可以简单地将ID保存在列表中(从grid-1到grid-9),这样我就可以避免上述计算。
感谢您的帮助