首页 文章

RGBC的CGColorSpace在哪里?

提问于
浏览
1

我正在尝试绘制一个带有渐变的圆圈,从白色到透明 . 我正在使用Core Graphics .

这是我从白色到黑色绘制渐变的方法:

let colorSpace = CGColorSpaceCreateDeviceRGB();
let colors = [UIColor.white.cgColor, UIColor.black.cgColor] as CFArray;
let locations : [CGFloat] = [0.0, 1.0];
let glowGradient : CGGradient = CGGradient.init(colorsSpace: colorSpace, colors: colors, locations: locations)!;
let ctx = UIGraphicsGetCurrentContext()!;
ctx.drawRadialGradient(glowGradient, startCenter: rectCenter, startRadius: 0, endCenter: rectCenter, endRadius: imageWidthPts/2, options: []);

但是,我不想画白到黑;我想画白到透明 .

为此,我首先尝试将结束颜色更改为 UIColor.white.cgColor.copy(alpha: 0.0) (即透明白色) . 然而,这失败了:

fatal error: unexpectedly found nil while unwrapping an Optional value

我假设此错误是由于颜色超出指定的RGB颜色空间( CGColorSpaceCreateDeviceRGB() ) .

修复似乎是将指定的颜色空间更改为具有alpha组件的颜色空间,例如RGBA . 但是,这样的色彩空间似乎不存在!只有 CGColorSpaceCreateDeviceRGBCGColorSpaceCreateDeviceCMYKCGColorSpaceCreateDeviceGray .

但是没有可用的alpha分量的颜色空间是没有意义的 . 该文档明确描述了对渐变中alpha的支持 . The documentation for CGGradient.init说:

例如,如果颜色空间是RGBA颜色空间,并且您希望在渐变中使用两种颜色(一种用于起始位置,另一种用于结束位置),则需要在组件中提供8个值 - 红色,绿色第一种颜色的蓝色,蓝色和Alpha值,然后是第二种颜色的红色,绿色,蓝色和Alpha值 .

这种RGBA编码非常有意义,但是我不可能告诉Core Graphics我正在使用这种RGBA编码,因为没有RGBA色彩空间!

RGBA的 CGColorSpace 在哪里?

2 回答

  • 0

    一个稍微不满意的答案:您可以使用 .colorSpace 获取上下文的颜色空间 . 在我的情况下,它似乎给了我一个RGBA空间,但我看不出任何保证 .

    这是使用 .colorSpace 的渐变:

    let ctx = UIGraphicsGetCurrentContext()!;
    let colorSpace = ctx.colorSpace!;
    let colorComponents : [CGFloat] = [
     // R    G    B    A
        1.0, 1.0, 1.0, 1.0,
        1.0, 1.0, 1.0, 0.0,
        ];
    let locations : [CGFloat] = [0.0, 1.0];
    let glowGradient : CGGradient = CGGradient.init(
        colorSpace: colorSpace,
        colorComponents: colorComponents,
        locations: locations,
        count: locations.count
        )!;
    ctx.drawRadialGradient(glowGradient, startCenter: rectCenter, startRadius: 0, endCenter: rectCenter, endRadius: imageWidthPts/2, options: []);
    

    特别令人困惑的是,在我的情况下, colorSpace.numberOfComponents 评估为3,即不是RGBA,但它仍然正确地解释了渐变中的alpha分量 . ¯\_(ツ)_/¯

  • 0

    您不需要RGBA颜色空间来绘制透明的径向/线性渐变 . RGB色彩空间就足够了 . 如果它没有透明地绘制它,您可能具有视图的背景颜色或配置错误的上下文 .

    如果您要创建上下文,则要确保为不透明传递false:Iphone How to make context background transparent?

    如果're using a CALayer on a UIView, you need to make sure that the UIView'的背景颜色设置为UIColor.clear . 如果it's set to nil,您将最终使用黑色渐变混合 .

相关问题