Geo*_*old 17 iphone drawing off-screen uiview cgbitmapcontextcreate
我原来的问题:
我正在创建一个简单的绘图应用程序,需要能够绘制我现有的,先前绘制的内容
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];
}
Run Code Online (Sandbox Code Playgroud)
TODO:任何人都可以优化,drawRect以便只有(通常很小的)修改过的矩形区域用于复制吗?
| 归档时间: |
|
| 查看次数: |
9004 次 |
| 最近记录: |