我正在尝试用从白色到透明的渐变绘制阴影。我正在使用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。但是,这样的色彩空间似乎不存在!只有CGColorSpaceCreateDeviceRGB
,CGColorSpaceCreateDeviceCMYK
和CGColorSpaceCreateDeviceGray
。
但没有任何可用的颜色空间与alpha组件是没有意义的。该文档明确描述了对渐变中alpha的支持。 The documentation for CGGradient.init
说:
例如,如果颜色空间是RGBA颜色空间,并且您希望在渐变中使用两种颜色(一种用于起始位置,另一种用于结束位置),则需要在{{1}中提供8个值第一种颜色的红色,绿色,蓝色和alpha值,后面是第二种颜色的红色,绿色,蓝色和alpha值。
这种RGBA编码非常有意义,但是我不可能告诉Core Graphics我使用这种RGBA编码,因为没有RGBA色彩空间!
RGBA的components
在哪里?
答案 0 :(得分: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分量。 ¯\_(ツ)_/¯
答案 1 :(得分:0)
您不需要RGBA色彩空间来绘制透明的径向/线性渐变。 RGB色彩空间就足够了。如果它没有透明地绘制它,您可能具有视图的背景颜色或配置错误的上下文。
如果您要创建上下文,则需要确保为不透明传递false:Iphone How to make context background transparent?
如果你在UIView上使用CALayer,你需要确保UIView的背景颜色设置为UIColor.clear。如果it's set to nil,您最终会使用黑色渐变混合。