在我的应用程序中,我使用了以下视图层次结构:
UIView
----UIScrollView
--------TiledView (UIView subclass, uses CATiledLayer for drawing)
----OverlayView (UIView subclass)
简而言之 -TiledView
显示大平铺图像我还将自定义旋转应用于该视图:
tiledView.transform = CGAffineTransformMakeRotation(angle);
TiledView 的绘制方法:
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
...
NSString *fileName = [NSString stringWithFormat:@"tile_%d_%d.jpg", y + 1, x + 1];
UIImage *image = [UIImage imageNamed:fileName];
[image drawInRect:rect];
}
UIScrollView 允许滚动和缩放其内容。
覆盖视图覆盖 UIScrollView,具有透明背景并执行一些自定义绘图。我使用单独的视图来确保线宽和字体大小不受滚动视图中缩放比例的影响。
OverlayView的绘制方法:
- (void)drawRect:(CGRect)rect {
// Drawing code
[super drawRect:rect];
// Custom drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 0, 1);
CGContextSetLineWidth(context, lineWidth);
CGContextBeginPath(context);
CGContextMoveToPoint(context, (int)startPoint.x,(int) startPoint.y);
if (usesMidPoint)
CGContextAddLineToPoint(context, (int)midPoint.x, (int)midPoint.y);
CGContextAddLineToPoint(context, endPoint.x, endPoint.y);
CGContextStrokePath(context);
}
最初一切正常,但在玩了一些视图之后(例如来回滚动等),它在其中一个绘图函数中的某个随机线上崩溃。作为示例应用程序在线崩溃:
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 0, 1);
带堆栈:
#0 0x00503088 in CGColorEqualToColor
#1 0x00505430 in CGGStateSetStrokeColor
#2 0x005053b6 in setStrokeColorWithComponents
#3 0x0056150f in CGContextSetRGBStrokeColor
#4 0x000764ab in -[GADrawView drawRect:] at GADrawView.m:38
#5 0x016a7a78 in -[UIView(CALayerDelegate) drawLayer:inContext:]
#6 0x0077c007 in -[CALayer drawInContext:]
我错过了几个图形上下文之间所需的任何同步吗?或者可能有更好的方法来做我正在尝试的事情?