0

比如说,对于一个 iOS 应用程序,如果用户在屏幕上滑动手指,则会记录 50,000 个点。如果对 中的所有这些点都完成了绘制drawRect,那么下次用户触摸第 50,001 个点时,touchesMoved在下一行的末尾

[self.view setNeedsDisplay];

将导致drawRect再次运行并再次绘制所有 50,001 个点。因此,对于每 1 个新点(对于任何新的手指移动),所有 50,001 个点都需要重新绘制,这不是一种有效的方法。

我尝试只画最后一个点drawRect,它不会“添加到”现有视图,而是“擦除所有内容”然后画一个点。

有没有办法

1)无需drawRect调用就可以画出1个额外的点?
2)或者,可以drawRect在不先擦除整个屏幕的情况下多画一个点吗?

4

2 回答 2

1

看看方法-(void)setNeedsDisplayInRect:。您可以要求您的视图重绘其自身的指定矩形,但在实现drawRect:方法时要小心 - 您需要假设传递的 rect 参数只是您视图的整个矩形的一部分,并且您的绘图逻辑可能会有所不同。你也可以考虑clearContextBeforeDrawingUIView 的属性。

于 2012-04-21T08:21:27.847 回答
1

一种方法是在触摸结束时渲染到图像中,然后在生成更多路径时继续添加到图像中。如果需要并撤消缓冲区或需要重新生成图形,您可以将路径存储在数组中。

(显然,您将需要比这更多的代码)

 UIGraphicsBeginImageContextWithOptions(size, NO, 1.0);
 CGContextRef context = UIGraphicsGetCurrentContext();
 // do some drawing
 UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

哦-fwiw,我发现setNeedsDisplayInRect:在 iOS5 中很奇怪/错误。第一次调用它是全视图矩形,而不是作为参数传入的矩形。至少这是我在尝试使用它时发现的。也许我忽略了一些实现细节。

于 2012-04-21T08:31:33.230 回答