尝试使用drawRect绘制彩色圆时,为什么颜色会透明?

时间:2013-03-31 17:09:19

标签: iphone ios cocoa-touch

我正试图在UIView中绘制一个简单的圆圈。我知道我可以使用QuartzCore,但我想使用drawRect方法:

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, rect);
    CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor greenColor] CGColor]));
    CGContextFillPath(ctx);
}

当我设置[UIColor whiteColor]时,上述代码无效。当[UIColor whiteColor]视图变得透明时..

为什么当颜色为白色时视图会变得透明?我怎样画一个白色的圆圈?

2 个答案:

答案 0 :(得分:3)

CGContextSetFillColor的文档说明了第二个参数:

  

描述要设置的颜色的强度值数组。数组元素的数量必须等于当前填充颜色空间中的组件数量,再加上alpha值的附加组件。

greenColor来自RGB颜色空间。但是whiteColor不是。因此,在使用whiteColor时,您最终会传递错误数量的颜色分量。

更容易的解决方案是替换:

CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor greenColor] CGColor]));

使用:

[[UIColor greenColor] set];

或:

[[UIColor whiteColor] set];

更新

如果您真的想要Core Graphics,另一个选择是:

CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);

答案 1 :(得分:1)

由于色彩空间不匹配,您遇到了问题。您正在绘制的上下文默认情况下具有RBGA颜色空间,这需要输入四个组件(红色,蓝色,绿色,alpha)。但是当您使用[UIColor whiteColor]创建UIColor时,将使用灰度颜色空间创建此颜色,该颜色空间仅提供两个组件(白色,alpha)。因此,将一个颜色空间的值插入到不同的颜色空间会导致意想不到的后果。

因此您需要使用CGContextSetFillColorSpace()将上下文的颜色空间更改为灰度颜色空间...

或者您可以简单地使用更简单的方法CGContextSetFillColorWithColor(),它接收任何颜色空间的CGColor并应用于上下文,而不管CGColor的颜色空间。

- (void) drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, rect);
    CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
    CGContextFillPath(ctx);
}