2016-10-08 2 views
1

흰색에서 그라디언트로 음영 처리 된 원을 그리려합니다. Core Graphics를 사용하고 있습니다. 여기 RGBA 용 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()) 외부에있는 컬러로 인해 가정 : 그러나,이 실패했습니다.

해결 방법 지정된 색상 공간을 RGBA와 같은 알파 구성 요소가있는 것으로 변경하는 것 같습니다. 그러나 이러한 색상 공간은 존재하지 않는 것처럼 보입니다! CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceCMYKCGColorSpaceCreateDeviceGray 만 있습니다.

그러나 알파 구성 요소가있는 사용 가능한 색상 공간이없는 것은 당연합니다. 문서는 그라디언트의 알파 지원을 명시 적으로 설명합니다. The documentation for CGGradient.init는 말한다 : 색 공간은 RGBA 색 공간이며 그라데이션 (종료 위치에 대한 시작 위치에 대한 다른 하나)의 두 가지 색상을 사용하려는 경우

는 예를 들어, 사용자가 제공해야 components의 8 개 값 - 첫 번째 색상은 빨간색, 녹색, 파란색 및 알파 값, 두 번째 색상은 빨간색, 녹색, 파란색 및 알파 값이 뒤 따른다.

이 RGBA 인코딩은 완벽합니다. 그러나 RGBA 색상 공간이 없기 때문에 Core Graphics에게 내가 그런 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: []); 

그것은 즉하지 RGBA 제 경우, colorSpace.numberOfComponents 3으로 평가하는 것이 특히 혼란 아직 여전히 올바르게 구배 알파 요소를 해석한다. ¯\_(ツ)_/¯

0

투명 방사형/선형 그래디언트를 그릴 때 RGBA 색 공간이 필요하지 않습니다. RGB 색상 공간이면 충분합니다. 투명하게 그리지 않을 경우보기의 배경색이나 컨텍스트가 잘못 구성되었을 수 있습니다.

당신은 당신이 불투명 false를 전달 있는지 확인하려면 상황에 맞는 만드는 경우 : Iphone How to make context background transparent?

당신이있는 UIView에있는 CALayer를 사용하는 경우, 당신은 확인해야을 그 UIView의의 배경 색상 UIColor.clear로 설정됩니다. it's set to nil 인 경우 그라디언트가 검정색으로 혼합됩니다.

관련 문제