我原来的问题:
我正在创建一个简单的绘图应用程序,并且需要能够在我的
drawRect
. 在不完全替换现有内容的情况下绘制现有内容的正确方法是什么?
根据在这里和其他地方收到的答案,这就是交易。
您应该准备好在
drawRect
调用时重新绘制整个矩形。您无法通过执行以下操作来防止内容被删除:
[self setClearsContextBeforeDrawing: NO];
这只是对图形引擎的一个提示,让它为您预先清除视图是没有意义的,因为无论如何您可能需要重新绘制整个区域。它可能会阻止您的视图被自动删除,但您不能依赖它。
要在视图顶部绘制而不擦除,请在屏幕外位图上下文中进行绘图(系统永远不会清除该上下文。)然后在您的 中
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];
}
TODO:任何人都可以优化,drawRect
以便只使用(通常很小的)修改后的矩形区域进行复制吗?