我正试图在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]
视图变得透明时..
为什么当颜色为白色时视图会变得透明?我怎样画一个白色的圆圈?
答案 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);
}