RGBC的CGColorSpace在哪里?

我正在尝试绘制一个从白色到透明的渐变阴影。 我正在使用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的支持。 CGGradient.init的文档说:

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

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

CGColorSpace在哪里?


稍微不满意的答案:您可以使用.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分量。 ¯_(ツ)_/¯


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

如果你正在创建一个上下文,你想确保你传递false为不透明:iphone如何使上下文背景透明?

如果您在UIView上使用CALayer,则需要确保UIView的背景色设置为UIColor.clear。 如果它设置为零,则最终将使用黑色渐变混合。

链接地址: http://www.djcxy.com/p/87545.html

上一篇: Where is the CGColorSpace for RGBA?

下一篇: transparent background color in CSS from hex RGB value