为啥尝试使用 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 绘制彩色圆圈时颜色是透明的?的主要内容,如果未能解决你的问题,请参考以下文章