0

我正在尝试使用 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);
4

1 回答 1

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。

的文档CGContextSetFillColor指出:

请注意,现在首选的 API 是 CGContextSetFillColorWithColor。

于 2013-08-15T04:00:32.890 回答