2

我正在尝试在 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]视图变得透明时..

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

4

2 回答 2

3

CGContextSetFillColor用于说明第二个参数的文档如下:

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

来自greenColorRGB 颜色空间。但whiteColor不是。所以你最终在使用时传递了错误数量的颜色分量whiteColor

一个更简单的解决方案是替换:

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

和:

[[UIColor greenColor] set];

或者:

[[UIColor whiteColor] set];

更新:

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

CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
于 2013-03-31T17:38:44.100 回答
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);
}
于 2013-03-31T17:47:14.037 回答