2012-10-29 59 views
0

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

我有斑点(UIImageViews)的一个网格,可以通过20.

当用户拖动他们的手指的线绘制在屏幕跟踪用户手指上由3是3到20。当用户与网格点相交时,线条的起点捕捉到该点并继续跟踪手指,基本上允许您在网格上绘制形状。

目前我有一个for循环,检查touchlocation是否与网格点相交。这确实有用,但由于显而易见的原因,它们非常缓慢,因为它们有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 
    } 
} 
+0

您正在绘制一个正方形网格?你只能用数学来做到这一点。没有视图匹配需要..基本上,你应该得到的位置'[aTouch locationInView:containerView]'并检查位置的正确性。 – calimarkus

+0

基本上我想检查touchlocation是否与'UIImageViews'的一个相交 –

+0

如何继承UIImageView,然后使用每个视图自己的touchesMoved委托方法来找出触摸的位置? – jimpic

回答

0

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

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

即使您的对象未安排在严格的网格上,您也可以使用此技术。仅仅将屏幕划分为4个象限将大大减少检查对象所需的时间,大约为初始时间的四分之一。

如果你的对象正在移动,你将不得不保持这个数组的更新。

这个二维数组只是我的第一个想法,这是基于你问题中有限信息的一个更好的方法。这可能不是在您的实际程序中工作的最佳方式,并且可能更适合使用不同的数据结构和算法。

0

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

我还是不太明白你想要画什么。你能给我们一个例子吗?

+0

对不起,绘图代码是我'setNeedsDisplay'不是实际绘图。基本上我想要的是用手指从现场画出一条线来创建形状。这可能是一个正方形,星形,六边形。我需要一种方法来了解手指在什么位置,然后我可以画到那个位置。 –