私の元の質問:
私は単純な描画アプリケーションを作成しており、既存の以前に描画されたコンテンツを
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];
}
TODOdrawRect
: (通常は小さい) 変更された四角形領域のみがコピーに使用されるように、誰でも最適化できますか?