获取touchesMoved中的当前触摸

时间:2012-10-29 10:59:36

标签: ios touchesmoved

我想在touchesMoved中获取当前对象。这不应与touchLocation(CGPoint)混淆,而是与用户触摸的实际对象混淆。使用UITouch始终返回初始触摸(如苹果文档中所述),而不是当前或最新的触摸。

我有一个斑点网格(UIImageViews),可以是3乘3到20乘20。

当用户在屏幕上拖动手指时,会绘制一条跟踪用户手指的线条。当用户与gridspot相交时,线的起点将捕捉到该点并继续跟踪手指,实际上允许您在网格上绘制形状。

目前我有一个for循环,用于检查触摸位置是否与网格点相交。这确实有效,但是当它们是400个网格点时,由于显而易见的原因而非常缓慢。

我也尝试过手势识别器,但这些取消了接触。

非常感谢任何帮助/建议,谢谢!

编辑:这就是我在touchesMoved中所拥有的。

UITouch* touch = [touches anyObject];
CGPoint touchLocation =[touch locationInView:self];

for (int i=100; i<tagInt; i++) {

    UIImageView *img=(UIImageView*)[self.view viewWithTag:i];

    if (CGRectContainsPoint(img.frame, touchLocation)) {
       //Drawing code  setNeedsDisplay etc
    }
 }

2 个答案:

答案 0 :(得分:0)

正如对初始问题的评论中所讨论的那样,从容器视图中找到触摸位置似乎是最好的。此代码中最大的瓶颈是将所有对象存储在一个线性数组中,然后检查数组中的每个元素。更好的方法是以更好的格式存储对象,您可以根据位置访问单个对象。

如果您的对象排列在严格的网格上,那么将它们存储在二维数组中应该足够快。将屏幕细分为网格分区,然后在这些网格分区中找到touchesMoved点。使用这两个整数作为2D数组的索引,并检查数组中该位置的可用对象。如果您在网格上的每个位置都没有对象,只需在该位置存储一个零,以告诉您的代码“无需在此处查看”。如果每个网格位置可能有多个对象,则可以在数组中的该位置保留对象列表,并检查列表中的所有对象。这将远远少于总数(如果您的对象没有聚集)。

即使你的对象没有安排在严格的网格上,你也可以使用这种技术。仅将屏幕划分为4个象限,可以将检查对象所需的时间缩短到初始时间的四分之一。

如果您的对象正在移动,则必须更新此阵列。

根据您问题中的有限信息,这个2D数组只是我第一次想到更好的方法。它可能不是在您的实际程序中工作的最佳方式,并且不同的数据结构和算法可能更适合。

答案 1 :(得分:0)

您应该将绘图代码放入触控处理方法中。也许最好的方法是将所有触点保存在临时可变数组中。在drawRect方法中,每帧绘制一次正确的行。从触摸处理方法中取出逻辑。 (您也可以在后台进行位置定位计算,并在完成后更新线路。)

我仍然不太了解你想要画的东西。你能给我们一个示例图片吗?