我试图画一个从白色到透明渐变阴影的圆圈。我在使用核心图形。
下面是从白色到黑色的渐变图:
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的支持。CGGradient.init说:
例如,如果颜色空间是RGBA颜色空间,并且希望在渐变中使用两种颜色(一种用于起始位置,另一种用于结束位置),则需要为第一种颜色提供8个
components-red值、绿色、蓝色和alpha值,然后为第二种颜色提供红色、绿色、蓝色和alpha值。
这个RGBA编码非常有意义,但是不可能告诉Core Graphics我正在使用这样的RGBA编码,因为没有RGBA颜色空间!
RGBA的CGColorSpace在哪里?
发布于 2017-04-04 19:17:28
您不需要RGBA颜色空间来绘制透明的径向/线性梯度。RGB颜色空间就足够了。如果它没有透明地绘制它,您可能会看到视图的背景色或上下文配置错误。
如果要创建上下文,则要确保传入false用于不透明:Iphone How to make context background transparent?
如果在CALayer上使用UIView,则需要确保UIView的背景色设置为UIColor.clear。如果是it's set to nil,你将以渐变和黑色混合结束。
发布于 2016-10-09 09:37:06
一个稍微令人不满意的答案是:您可以使用.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组件。¯\_(ツ)_/¯
https://stackoverflow.com/questions/39937142
复制相似问题