То, что вы делаете сейчас, - это создание парных CGImage
и CGBitmapContext
для каждого вызова на drawSquareFrom:to:
и их удаление каждый раз. Вместо этого создайте отдельные парные CGImage
и CGBitmapContext
, которые вы будете использовать для каждого вызова.
-(void) drawSquareFrom:(CGPoint)from to:(CGPoint)to {
CGContextRef context = [self offscreenContext];
CGRect draw , full = [self offscreenContextBounds];
draw.origin = from;
draw.size.width = to.x - from.x;
draw.size.height = to.y - from.y;
draw = CGRectStandardize( draw );
[[UIColor redColor] setStroke];
[[UIColor clearColor] setFill];
CGContextClearRect( context , full );
CGContextFillRect( context , draw );
CGContextStrokeRectWithWidth( context , draw , 10 );
[_imageView setNeedsDisplay];
}
Вы создаете парные CGImage и CGContext, как это, хотя есть некоторые ... для заполнения. Все переменные myX предназначены для членов класса.
-(CGContextRef) offscreenContext {
if ( nil == myContext ) {
size_t width = 400;
size_t height = 300;
CFMutableDataRef data = CFDataCreateMutable( NULL , width * height * 4 ); // 4 is bytes per pixel
CGDataProviderRef provider = CGDataProviderCreateWithCFData( data );
CGImageRef image = CGImageCreate( width , height , ... , provider , ... );
CGBitmapContextRef context = CGBitmapContextCreate( CFDataGetMutableBytePtr( data ) , width , height , ... );
CFRelease( data ); // retained by provider I think
CGDataProviderRelease( provider ); // retained by image
myImage = image;
myContext = context;
myContextFrame.origin = CGPointZero;
myContextFrame.size.width = width;
myContextFrame.size.height = height;
_imageView.image = [UIImage imageWithCGImage:image];
}
return myContext;
}
-(CGRect) offscreenContextBounds {
return myContextFrame;
}
Устанавливает _imageView.image для вновь созданного изображения. В drawSquareFrom:to:
я предполагаю, что setNeedsDisplay достаточно, чтобы нарисовать сделанные изменения, но может случиться так, что вам нужно будет каждый раз назначать новый UIImage, который оборачивает тот же CGImage.