iOS - 核心图形适用于颜色,但不适用于黑色,白色,灰色

时间:2014-06-14 08:37:57

标签: ios objective-c core-graphics drawrect cgcontext

我使用以下类绘制一个简单的描边圆圈:

 @implementation StrokedCircle

 - (id)initWithRadius:(CGFloat)radius strokeWidth:(CGFloat)strokeWidth strokeColor:(UIColor *)strokeColor
 {
     self = [super initWithRadius:radius];
     if (self)
     {
         _strokeWidth = strokeWidth;
         _strokeColor  = strokeColor;
     }
     return self;
 }


 - (void)drawRect:(CGRect)rect
 {
     NSLog(@"Drawing with color %@ and stroke width %f", self.strokeColor, self.strokeWidth);

     CGContextRef context = UIGraphicsGetCurrentContext();
     CGRect circleRect = CGRectInset(rect, self.strokeWidth, self.strokeWidth);
     CGContextAddEllipseInRect(context, circleRect);
     CGContextSetLineWidth(context, self.strokeWidth);
     CGContextSetStrokeColor(context, CGColorGetComponents([self.strokeColor CGColor]));
     CGContextStrokePath(context);
 }

 @end

注意:超类是一个简单的圆(UIView的子类),其中设置了radius属性,并且视图的背景颜色设置为clearColor

在视图控制器中,我在viewDidLoad中添加以下代码:

 - (void)viewDidLoad
 {
     [super viewDidLoad];
     StrokedCircle *strokedCircle = [[StrokedCircle alloc] initWithRadius:50.0 strokeWidth:1.0 strokeColor:[UIColor blueColor]];
     strokedCircle.center = self.view.center;
     [self.view addSubview:strokedCircle];
 }

这实际上工作正常,控制台输出: 2014-06-14 10:31:58.270 ShapeTester[1445:60b] Drawing with color UIDeviceRGBColorSpace 0 0 1 1 and stroke width 1.000000并在屏幕中间显示一个蓝色圆圈。

blue stroked circle

但是,当我将颜色修改为[UIUColor blackColor][UIColor grayColor][UIColor whiteColor]时(但随后也会更改视图&{39} backgroundColor),没有圆圈是显示了。

有谁知道这种行为的原因是什么?核心图形没有绘制灰度颜色吗?我仔细阅读了Core Graphics Programming Guide中的相应部分,但那里没有提到这样的内容。

1 个答案:

答案 0 :(得分:6)

黑色,白色和灰色(由您命名的方法返回)不在RGB颜色空间中。它们处于灰度色彩空间。灰度颜色空间只有一个组件(加上alpha),而不是三个(加上alpha)。因此,您只设置笔触颜色的一个组件,而其他两个组件未定义。由于这个问题,你可能最终将alpha设置为零,所以你什么也得不到。

请勿使用CGContextSetStrokeColor。它需要您担心颜色空间(您需要使用CGContextSetStrokeColorSpace设置)。相反,使用CGContextSetStrokeColorWithColor,它设置颜色空间和颜色分量:

CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);