我想在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
}
}
答案 0 :(得分:0)
正如对初始问题的评论中所讨论的那样,从容器视图中找到触摸位置似乎是最好的。此代码中最大的瓶颈是将所有对象存储在一个线性数组中,然后检查数组中的每个元素。更好的方法是以更好的格式存储对象,您可以根据位置访问单个对象。
如果您的对象排列在严格的网格上,那么将它们存储在二维数组中应该足够快。将屏幕细分为网格分区,然后在这些网格分区中找到touchesMoved点。使用这两个整数作为2D数组的索引,并检查数组中该位置的可用对象。如果您在网格上的每个位置都没有对象,只需在该位置存储一个零,以告诉您的代码“无需在此处查看”。如果每个网格位置可能有多个对象,则可以在数组中的该位置保留对象列表,并检查列表中的所有对象。这将远远少于总数(如果您的对象没有聚集)。
即使你的对象没有安排在严格的网格上,你也可以使用这种技术。仅将屏幕划分为4个象限,可以将检查对象所需的时间缩短到初始时间的四分之一。
如果您的对象正在移动,则必须更新此阵列。
根据您问题中的有限信息,这个2D数组只是我第一次想到更好的方法。它可能不是在您的实际程序中工作的最佳方式,并且不同的数据结构和算法可能更适合。
答案 1 :(得分:0)
您应该不将绘图代码放入触控处理方法中。也许最好的方法是将所有触点保存在临时可变数组中。在drawRect
方法中,每帧绘制一次正确的行。从触摸处理方法中取出逻辑。 (您也可以在后台进行位置定位计算,并在完成后更新线路。)
我仍然不太了解你想要画的东西。你能给我们一个示例图片吗?