如何使用iphonesdk高效地查找某个x,y点的rect

如何使用iphonesdk高效地查找某个x,y点的rect,iphone,Iphone,我正在寻找一种有效的方法来处理触摸法的图像/帧检测。假设我正在制作一个键盘或类似的东西。我在UI上放置了“n”个图像。当有人触摸字母表(这是一个图像)时,我可以执行以下操作来检测相应的字母 1) CGRectIntersectsRect(…,…):如果我使用这个,那么我需要检查每个字母,以找出在该接触点存在的字母(比如100100)。这就变成了O(n)。如果我的手指在屏幕上移动,那么我会得到m个点&所有相应的图像检测都会变成O(n*m),这是不好的 2) 另一种方法是为每个&everyx,y位置

我正在寻找一种有效的方法来处理触摸法的图像/帧检测。假设我正在制作一个键盘或类似的东西。我在UI上放置了“n”个图像。当有人触摸字母表(这是一个图像)时,我可以执行以下操作来检测相应的字母

1) CGRectIntersectsRect(…,…):如果我使用这个,那么我需要检查每个字母,以找出在该接触点存在的字母(比如100100)。这就变成了O(n)。如果我的手指在屏幕上移动,那么我会得到m个点&所有相应的图像检测都会变成O(n*m),这是不好的

2) 另一种方法是为每个&everyx,y位置构建一个散列,以便查找将是简单的O(1)。但这同样是一个内存限制,因为我需要存储300*300(假设我使用的是300*300屏幕大小)。如果我重新整理我的信件,那么一切都需要重新计算。所以这不好

换句话说,我需要一些东西,比如,给定一个点(x,y),我需要一些方法来找到哪个矩形有效地覆盖了那个点

很抱歉发了这么长的邮件&如果您能提供帮助,我们将不胜感激


谢谢

如果规则网格中有,则用网格大小除以整数。假设你有一个小的,固定的屏幕大小,一个bucket数组会给出类似的增益(一个2D网格,其中每个条目都是一个与网格部分相交的矩形列表),如果调整正确的话,这个增益非常快,所以列表只有几个成员。对于无界或大空间,可以使用KD树

将想要作为最终目标的矩形设置为子视图,作为一个更大的
UIView
(或子类)是很有用的,您希望所有这些相关的命中都会发生。例如,如果您正在构建自己的键盘,您可以添加一组
UIButton
对象作为子视图,然后点击测试这些对象

因此,对一组子视图进行点击测试的简单而传统的方法是,只要有人点击这些按钮就可以触发代码。例如,您可以将子视图添加为
UIControl
对象(这是
UIView
的一个子类,它添加了一些捕捉用户触摸事件的有用方法),并调用
addTarget:action:forControlEvents:
指定当用户在该
UIControl
的矩形中执行某项操作时要触发的某些方法。例如,您可以捕获诸如
UIControlEventTouchDown
UIControlEventTouchDragEnter
之类的内容。您可以在中阅读完整的列表

现在,听起来你可能想要更个性化的东西。如果您真的想从一个随机(x,y)坐标开始,并知道它在哪个矩形中,您也可以使用。此方法获取视图中的一个点,并查找包含该点的最详细(层次结构中最低的)子视图


如果您想将这些子视图纯粹用于点击测试而不是显示,则可以将它们的背景色设置为
[UIColor clearColor]
,但不要隐藏它们(即将
隐藏的
属性设置为
),禁用用户与它们的交互(通过
用户交互启用的
BOOL属性),或者将alpha设置为0.1以下,因为任何这些情况都会导致
hitTest:withEvent:
方法跳过该子视图。但是,您仍然可以在该方法调用中使用不可见子视图,只要它满足这些条件。

感谢Pete Kirkham&Tyler的回答,这些回答非常有用。假设我不想使用按钮,因为我主要以小矩形显示图像。为了检查rect@(x,y),我可以通过将网格设置为正方形来轻松触发它&查找

gridcolumn=数学楼层(位置x/单元宽度);gridrow=数学楼层(位置y/单元高度)

但我的问题是触摸移动。假设我从@grid-1开始,一直拖到grid-9(在一个3*3的矩阵中),在这种情况下,我假设我将得到100-300(x,y)个位置,所以每次我都需要运行上面的公式来确定相应的网格。这将导致300次计算,这可能会影响性能

所以,当我将一个图像显示为一个矩形时,我可以为该图像关联一些id吗?这样我就可以简单地将ID保存在一个列表中(从grid-1到grid-9),这样我就可以避免上面的计算


感谢您的帮助

查看UIView的标记属性。如果图像位于UIView或UIView的子视图中,则可以设置每个标记并使用该标记在数组中查找

如果没有,则可以通过将矩形数组划分为适合较大矩形的集合来提高速度。首先测试外矩形,然后测试内矩形。25个矩形只需10次测试,最坏情况为5组5个