如何在iPhone上使用Quartz时保留上一张图纸?

时间:2010-09-28 19:41:55

标签: iphone uiview quartz-2d

我想通过触摸并在屏幕上拖动来在iPhone上绘制一条简单的线条。我设法通过继承UIView并更改默认的drawRect:方法来做到这一点。同时在我的viewcontroller中,我检测到触摸事件并在必要时调用[myView setNeedsDisplay]。问题是,当我尝试绘制第二行时,前一行消失。有没有办法在屏幕上保留上一行?

非常感谢任何输入。

2 个答案:

答案 0 :(得分:4)

通常的方法是使用CGBitmapContextCreate()。在-init / -init-WithFrame:/ etc中创建它,并在-dealloc中调用CGContextRelease()。我不确定你是如何使用CGBitmapContextCreate()来处理“视网膜显示”的2x比例。

(UIGraphicsBeginImageContext()更容易,但UIGraphicsBeginImageContext(); myContext = CFRetain(UIGraphicsGetCurrentContext()); UIGraphicsEndImageContext();可能不安全。)

然后执行类似

的操作
#import <QuartzCore/CALayer.h>

-(void)displayLayer:(CALayer*)layer
{
  UIGraphicsPushContext(mycontext);
  ... Update the bitmap context by drawing a line...
  UIGraphicsPopContext();
  CGImageRef cgImage = CGBitmapContextCreateImage(mycontext);
  layer.contents = (id)cgImage;
  CFRelease(cgImage);
}

我使用-displayLayer:(一个CALayer委托函数;一个UIView是它的图层委托)而不是-drawRect:来提高效率:如果你使用-drawRect:,CALayer会创建一个第二个上下文(因此是位图的第二个副本)。


或者,您可能会对CGLayer感到满意。我从未见过使用它而不是位图上下文的理由; 可能在某些情况下会更有效率。


或者,可能会设置self.clearsContextBeforeDrawing = NO,但这很可能会中断。 UIKit(或者更确切地说,CoreAnimation)期望你绘制剪辑rect中包含的整个视图(这是-drawRect:的“rect”参数;它不能保证是边界)。如果你的视图在屏幕外,CoreAnimation可能会决定它想要内存。或者CoreAnimation可能只绘制屏幕上的视图部分。或者CoreAnimation可能会进行双缓冲绘制,导致您的视图在两种状态之间翻转。

答案 1 :(得分:0)

如果使用drawRect:绘制,则需要绘制整个区域。因此,您不仅需要存储最新部件的数据,还需要存储所有数据。

作为替代方案,您可以直接绘制到位图中,或者为您的线生成动态子视图(仅对非常有限的绘图有意义(即一些基于矢量的内容)。