我有一个Quartz类,在iOS上运行良好,可以在灰色圆圈上绘制橙色的披萨片样式图表,现在我正在尝试将其转换为Cocoa。
+ (UIImage *)circleWithDiameter:(CGFloat) diameter
color:(UIColor *)color
progress:(CGFloat)progress {
CGFloat radius = diameter/2.0f;
CGFloat scale = [[UIScreen mainScreen] scale]; // we need to size the graphics context according to the device scale
CGRect rect = CGRectMake(0.0f, 0.0f, diameter, diameter);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);
CGContextRef context = UIGraphicsGetCurrentContext();
// create a gray circle background
CGContextSetLineWidth(context, 0); // set the line width
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextBeginPath(context);
CGContextAddEllipseInRect(context, rect);
CGContextDrawPath(context, kCGPathFill); // Or kCGPathFill
// Draw the slice
CGFloat angle = progress * 2.0f * M_PI;
CGPoint center = CGPointMake(radius, radius);
CGContextBeginPath(context);
CGContextMoveToPoint(context, center.x, center.y);
CGPoint p1 = CGPointMake(center.x + radius * cosf(angle),
center.y + radius * sinf(angle));
CGContextAddLineToPoint(context, p1.x, p1.y);
CGContextMoveToPoint(context, center.x, center.y);
CGContextAddArc(context, center.x, center.y, radius, 0.0f, angle, 0);
CGContextClosePath(context);
UIColor *orange = [UIColor orangeColor];
CGContextSetFillColorWithColor(context, orange.CGColor);
CGContextDrawPath(context, kCGPathFill);
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
CGContextRelease(context);
return result;
}
这是我已经转换成 Cocoa 的类。
+ (NSImage *)circuloWithDiameter:(CGFloat)diameter
color:(NSColor *)color
progress:(CGFloat)progress {
CGFloat radius = diameter/2.0f;
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
// draw the gray circle background
CGContextSetLineWidth(context, 0); // set the line width
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextBeginPath(context);
CGContextAddEllipseInRect(context, rect);
CGContextDrawPath(context, kCGPathFill); // Or kCGPathFill
// draw the orange slice
CGFloat angle = progress * 2.0f * M_PI;
CGPoint center = CGPointMake(radius, radius);
CGContextBeginPath(context);
CGContextMoveToPoint(context, center.x, center.y);
CGPoint p1 = CGPointMake(center.x + radius * cosf(angle),
center.y + radius * sinf(angle));
CGContextAddLineToPoint(context, p1.x, p1.y);
CGContextMoveToPoint(context, center.x, center.y);
CGContextAddArc(context, center.x, center.y, radius, 0.0f, angle, 0);
CGContextClosePath(context);
NSColor *orange = [NSColor orangeColor];
CGContextSetFillColorWithColor(context, orange.CGColor);
CGContextDrawPath(context, kCGPathFill);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
NSImage* result = [[NSImage alloc] initWithCGImage:imageRef size:NSMakeSize(diameter, diameter)];
CFRelease(imageRef);
CGContextRelease(context);
return result;
}
显然,转换过程很顺利,Xcode没有抱怨任何问题,但当Cocoa版本运行时,它会在该行崩溃。
CGImageRef imageRef = CGBitmapContextCreateImage(context);
带有消息
<Error>: CGBitmapContextCreateImage: invalid context 0x600000160180. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.
出了什么问题?有线索吗?
UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);
创建的,但似乎OSX代码在获取它之前不会创建上下文[NSGraphicsContext currentContext]
。 - KudoCCCGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
不是在创建一个上下文吗? - Duck+ (NSGraphicsContext *)graphicsContextWithAttributes:(NSDictionary *)attributes
。 - KudoCC