如何在永久性画布上绘制并将其绘制在视图中?
|
我正在为iOS编写一个小型绘画应用程序。我在UIView广告的drawRect:方法中将其子类化。直到我开始有很多对象(实际上是折线),然后性能开始下降,一切都很好。
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
CGContextRef imageContext = UIGraphicsGetCurrentContext();
int i, j;
for(i = 0; i < [_strokes count]; i++) {
NSMutableArray *stroke = [_strokes objectAtIndex:i];
if([stroke count] < 2) {
continue;
}
CGContextSetStrokeColorWithColor(imageContext, [[_penColours objectAtIndex:i] CGColor]);
for(j = 0; j < [stroke count]-1; j++) {
CGPoint line[] = {
[[stroke objectAtIndex:j] CGPointValue],
[[stroke objectAtIndex:j+1] CGPointValue]
};
CGContextSetLineWidth(imageContext, _brushSize);
CGContextSetLineCap(imageContext, kCGLineCapRound);
CGContextSetLineJoin(imageContext, kCGLineJoinRound);
CGContextAddLines(imageContext, line, 2);
CGContextStrokePath(imageContext);
}
}
CGContextFlush(imageContext);
}
_strokes是点数组的数组。我的第一个想法是将图像制作为一个ivar,在上下文上绘画,将其他笔画绘制到上下文(将j = 0
更改为j = [stroke count] - 2
),然后将上下文获取为图像,然后将其存储回ivar。没用
然后,我尝试了许多其他值得一提的道路,直到我发现了SO的另一个问题(Quartz2D性能-如何提高)。不幸的是,它没有按我预期的那样工作,因为我必须保留图像,导致内存警告1、2崩溃。
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
UIGraphicsBeginImageContext(CGSizeMake(1024, 768));
CGContextRef imageContext = UIGraphicsGetCurrentContext();
if(_image != nil) {
CGContextDrawImage(imageContext, CGRectMake(0, 0, 1024, 768), [_image CGImage]);
}
int i, j;
for(i = 0; i < [_strokes count]; i++) {
NSMutableArray *stroke = [_strokes objectAtIndex:i];
if([stroke count] < 2) {
continue;
}
CGContextSetStrokeColorWithColor(imageContext, [[_penColours objectAtIndex:i] CGColor]);
for(j = [stroke count]-2; j < [stroke count]-1; j++) {
CGPoint line[] = {
[[stroke objectAtIndex:j] CGPointValue],
[[stroke objectAtIndex:j+1] CGPointValue]
};
CGContextSetLineWidth(imageContext, _brushSize);
CGContextSetLineCap(imageContext, kCGLineCapRound);
CGContextSetLineJoin(imageContext, kCGLineJoinRound);
CGContextAddLines(imageContext, line, 2);
CGContextStrokePath(imageContext);
}
}
_image = UIGraphicsGetImageFromCurrentImageContext();
[_image retain];
UIGraphicsEndImageContext();
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 1024, 768), [_image CGImage]);
}
没有找到相关结果
已邀请:
1 个回复
骚瓤