我正在使用以下类绘制一个简单的描边圆:
@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
属性,并且视图的backgroundcolor设置为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
并在屏幕中间显示一个蓝色圆圈.
然而,当我修改的颜色[UIUColor blackColor]
,[UIColor grayColor]
或[UIColor whiteColor]
(但随后又改变视图的backgroundColor
),无圆示出任何更多.
有谁知道这种行为的原因是什么?核心图形不会绘制灰度颜色吗?我阅读了核心图形编程指南中的相应部分,但那里没有提到这样的内容.
黑色,白色和灰色(由您命名的方法返回)不在RGB颜色空间中.它们处于灰度色彩空间.灰度颜色空间只有一个组件(加上alpha),而不是三个(加上alpha).因此,您只设置笔触颜色的一个组件,而其他两个组件未定义.由于这个问题,你可能最终将alpha设置为零,所以你什么也得不到.
不要用CGContextSetStrokeColor
.它需要您担心颜色空间(您需要使用它设置CGContextSetStrokeColorSpace
).而是使用CGContextSetStrokeColorWithColor
,它设置颜色空间和颜色组件:
CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);