2016-10-08 38 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,則最終將使用黑色漸變混合。