【问题标题】: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] 时,视图将变得透明..

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

【问题讨论】:

    标签: iphone ios cocoa-touch


    【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-09
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多