0

我想让当前对象被触及touchesMoved。这不要与 touchLocation (CGPoint) 混淆,而是用户正在触摸的实际对象。使用UITouch总是返回初始触摸(正如它在苹果文档中所说),而不是当前或最新的触摸。

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

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

目前我有一个 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
    }
 }
4

2 回答 2

0

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

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

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

如果您的对象正在移动,则必须保持此数组更新。

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

于 2012-10-29T13:38:13.610 回答
0

You should NOT put drawing code IN the touch handling method. Perhaps the best way is to just save all touch points within a temporary mutable array. And in the drawRect method you draw the correct line once per frame. Take the logic out of the touch handling method. (Also you could make the position fixing calculations in the background, and the line will be updated, after they are finished..)

I still don't quite get what you are trying to draw. could you give us an example image?

于 2012-10-29T16:05:18.900 回答