我正在尝试使用Core Graphics绘制两个同心圆。我希望以下代码在内部绘制一个蓝色圆圈和一个较小的白色圆圈,但它只绘制蓝色圆圈。我错过了什么?
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 100, 0, M_PI * 2, true);
CGContextSetFillColor(c, CGColorGetComponents([[UIColor blueColor] CGColor]));
CGContextFillPath(c);
CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 90, 0, M_PI * 2, true);
CGContextSetFillColor(c, CGColorGetComponents([[UIColor whiteColor] CGColor]));
CGContextFillPath(c);
答案 0 :(得分:2)
您正在以不必要的间接方式设置填充颜色。这样做:
CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 100, 0, M_PI * 2, true);
CGContextSetFillColorWithColor(c, [[UIColor blueColor] CGColor]);
CGContextFillPath(c);
CGContextAddArc(c, self.bounds.size.width/2, self.bounds.size.height/2, 90, 0, M_PI * 2, true);
CGContextSetFillColorWithColor(c, [[UIColor whiteColor] CGColor]);
CGContextFillPath(c);
或者,更好的是,直接使用UIKit的绘图方法:
[[UIColor blueColor] setFill];
[[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES] fill];
[[UIColor whiteColor] setFill];
[[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:90 startAngle:0 endAngle:M_PI * 2 clockwise:YES] fill];
您的代码失败,因为[[UIColor whiteColor] CGColor]
返回“灰色”颜色空间中的颜色,该颜色空间只有两个组件,“灰色”值(黑色为0,白色为1)和alpha值。在这种情况下,上下文是RGBA,因此CGContextSetFillColor
期望看到4个组件,三个用于RGB,一个用于alpha。
The documentation for CGContextSetFillColor
指出:
请注意,现在使用的首选API CGContextSetFillColorWithColor。