2016-10-08 14 views
1

Я пытаюсь нарисовать круг, затененный градиентом от белого до прозрачного. Я использую Core Graphics.Где находится CGColorSpace для RGBA?

Вот что у меня есть, который рисует градиент от белого к черному:

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()).

Возможно, исправление изменит указанное цветовое пространство на одно с альфа-компонентом, таким как RGBA. Однако такие цветовые пространства не существуют! Есть только CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceCMYK и CGColorSpaceCreateDeviceGray.

Но не имеет смысла, чтобы не было доступных цветовых пространств с альфа-компонентом. В документации явно описывается поддержка alpha в градиентах. The documentation for CGGradient.init говорит:

Например, если цветовое пространство является RGBA цветового пространства, и вы хотите использовать два цвета в градиенте (один для исходного местоположения, а другой для концовки место), то вам необходимо предоставить 8 значений в components -red, зеленый, синий и альфа-значения для первого цвета, за которым следуют красные, зеленые, синие и альфа-значения для второго цвета.

Эта кодировка RGBA имеет смысл, но невозможно сказать Core Graphics, что я использую такую ​​кодировку RGBA, потому что нет цветового пространства RGBA!

Где CGColorSpace для RGBA?

ответ

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?

Если вы используете CALayer на UIView, вы должны убедиться, что фоновый цвет UIView в установлен в UIColor.clear. Если it's set to nil, вы получите градиентное смешение с черным вместо этого.