我的原始问题:
我正在创建一个简单的绘图应用程序,需要能够在
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];
}
待办事项: 有人可以优化drawRect
使得只使用(通常很小的)修改矩形区域来进行复制吗?