首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RGBA的CGColorSpace在哪里?

RGBA的CGColorSpace在哪里?
EN

Stack Overflow用户
提问于 2016-10-08 20:38:18
回答 2查看 3.3K关注 0票数 2

我试图画一个从白色到透明渐变阴影的圆圈。我在使用核心图形。

下面是从白色到黑色的渐变图:

代码语言:javascript
复制
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) (即透明白色)。然而,这一做法失败了,因为:

代码语言:javascript
复制
fatal error: unexpectedly found nil while unwrapping an Optional value

我假定此错误是由于颜色位于指定的RGB颜色空间(CGColorSpaceCreateDeviceRGB())之外。

修复方法似乎是将指定的颜色空间更改为带有alpha组件的颜色空间,例如RGBA。然而,这样的颜色空间似乎并不存在!只有CGColorSpaceCreateDeviceRGBCGColorSpaceCreateDeviceCMYKCGColorSpaceCreateDeviceGray

但是,如果没有带有alpha组件的可用颜色空间,这是没有意义的。文档明确描述了渐变中对alpha的支持。CGGradient.init说:

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

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

RGBA的CGColorSpace在哪里?

EN

回答 2

Stack Overflow用户

发布于 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,你将以渐变和黑色混合结束。

票数 3
EN

Stack Overflow用户

发布于 2016-10-09 09:37:06

一个稍微令人不满意的答案是:您可以使用.colorSpace获得上下文的颜色空间。在我的例子中,它似乎给了我一个RGBA空间,但我看不到这方面的任何保证。

下面是使用.colorSpace的梯度

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39937142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档