Мой оригинальный вопрос:
Я создаю простой рисунок
приложение и должны быть в состоянии
рисовать поверх существующего, ранее нарисованного контента в моем 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
, чтобы для копии использовалась только (обычно крошечная) измененная область прямоугольника?