UIView:如何进行非破坏性绘图?

Geo*_*old 17 iphone drawing off-screen uiview cgbitmapcontextcreate

我原来的问题:

我正在创建一个简单的绘图应用程序,需要能够绘制我现有的,先前绘制的内容drawRect.在不完全替换现有内容的情况下绘制现有内容的正确方法是什么?

根据这里和其他地方收到的答案,这是交易.

  1. 您应该准备好在drawRect 调用时重绘整个矩形.

  2. 无法通过执行以下操作阻止内容被删除:

    [self setClearsContextBeforeDrawing: NO];

    这仅仅是对图形引擎的暗示,没有必要让它为您预先清除视图,因为您可能需要重新绘制整个区域.它可能会阻止您的视图被自动删除,但您不能依赖它.

  3. 要在不擦除的情况下在视图上绘制,请将绘图绘制到屏幕外位图上下文(系统永远不会清除它).然后在您drawRect的屏幕外缓冲区中复制到视图.

例:

- (id) initWithCoder: (NSCoder*) coder {    
     if (self = [super initWithCoder: coder]) {
         self.backgroundColor = [UIColor clearColor];
         CGSize size = self.frame.size;
         drawingContext = [self createDrawingBufferContext: size];
     }

     return self;
 }

- (CGContextRef) createOffscreenContext: (CGSize) size  {
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorSpace);

    CGContextTranslateCTM(context, 0, size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    return context;
}


- (void)drawRect:(CGRect) rect {    
    UIGraphicsPushContext(drawingContext);
    CGImageRef cgImage = CGBitmapContextCreateImage(drawingContext); 
    UIImage *uiImage = [[UIImage alloc] initWithCGImage:cgImage];
    UIGraphicsPopContext();
    CGImageRelease(cgImage);
    [uiImage drawInRect: rect];
    [uiImage release];
 }
Run Code Online (Sandbox Code Playgroud)

TODO:任何人都可以优化,drawRect以便只有(通常很小的)修改过的矩形区域用于复制吗?

Mar*_*ote 5

在屏幕外图像中绘制所有内容并在绘制屏幕时只显示此图像是相当常见的.您可以阅读:创建位图图形上下文.