为啥尝试使用 drawRect 绘制彩色圆圈时颜色是透明的?

Posted

技术标签:

【中文标题】为啥尝试使用 drawRect 绘制彩色圆圈时颜色是透明的?【英文标题】:Why is color transparent when attempting to draw a colored circle with drawRect?为什么尝试使用 drawRect 绘制彩色圆圈时颜色是透明的? 【发布时间】:2013-03-31 17:09:19 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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);

【讨论】:

【参考方案2】:

由于色彩空间不匹配,您遇到了问题。默认情况下,您要绘制的上下文具有 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);

【讨论】:

以上是关于为啥尝试使用 drawRect 绘制彩色圆圈时颜色是透明的?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone App - 为啥我的 CGContext 圆圈看起来像黑色方块?

剪辑时如何避免覆盖drawRect

透明背景 UIView drawRect 圆圈

如何在 Python 中用空圆圈绘制散点图?

drawRect中不同颜色的不同行为:[重复]

Swift drawRect 函数不会更新绘图