在iOS上,可以在不使用drawRect的情况下绘制某些内容吗?

时间:2012-04-21 08:08:34

标签: ios cocoa-touch uiview

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

[self.view setNeedsDisplay];

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

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

有没有办法

1)绘制1个额外的点而不需要调用drawRect
2)或者,drawRect可以在不先擦除整个屏幕的情况下绘制一个额外的点吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

(显然你需要更多的代码)

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

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