对于iOS应用程序说,如果用户在屏幕上滑动手指,则会记录50,000点。如果在drawRect
中对所有这些点进行了绘制,则下次用户触摸第50,001个点时,在touchesMoved
末尾的下一行
[self.view setNeedsDisplay];
将导致drawRect
再次运行并再次绘制所有50,001个点。因此,对于每1个新点(对于任何新的手指移动),所有50,001个点都需要重新绘制,这不是一种有效的方法。
我尝试在drawRect
中绘制最后一个点,但它不会“添加”到现有视图中,而是“擦除所有内容”,然后绘制一个点。
有没有办法
1)绘制1个额外的点而不需要调用drawRect
?
2)或者,drawRect
可以在不先擦除整个屏幕的情况下绘制一个额外的点吗?
答案 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。至少这是我在尝试使用它时发现的。也许我忽略了一些实现细节。