2016-10-08 16 views
1

我想绘制一个从白色到透明的渐变阴影。我正在使用Core Graphics。RGBC的CGColorSpace在哪里?

这里是我有画从白到黑的渐变:

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)的色彩空间。但是,这样的色彩空间似乎并不存在!只有CGColorSpaceCreateDeviceRGB,CGColorSpaceCreateDeviceCMYKCGColorSpaceCreateDeviceGray

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

例如,如果将色彩空间是一个RGBA色彩空间,并且要在梯度(一个用于起始位置,另一个是结束位置)使用两种颜色,那么你需要提供第一种颜色的红色,绿色,蓝色和alpha值为components中的8个值,​​然后是第二种颜色的红色,绿色,蓝色和alpha值。

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

RGBA的CGColorSpace在哪里?

回答

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,但它仍然可以正确解释该阿尔法分量的梯度。 ¯\_(ツ)_/¯

0

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

如果你正在创建你想确保你在错误的传递不透明的上下文:Iphone How to make context background transparent?

如果您使用上一个UIView一个CALayer的,你需要确保了UIView的背景颜色设置为UIColor.clear。如果it's set to nil,则最终将使用黑色渐变混合。