2017-11-06 6 views
1

여기실제로 CAGradientLayer를 따라 한 점에서 색을 "계산"하시겠습니까?

var gradientLayer = CAGradientLayer() 
func setup() { 

C = some complicated array of CGColors 
L = some complicated array of NSNumber (mono' increasing) 

gradientLayer.colors = C 
gradientLayer.locations = L 

gradientLayer.startPoint = CGPoint(x: 0, y: 0.5) 
gradientLayer.endPoint = CGPoint(x: 1, y: 0.5) 

layer.insertSublayer(gradientLayer, at: 0) 
} 

... .locations 배열 (과 일치하는 색상 하나) 수십 또는 항목의 수백의를 가질 수 물론 주, 흥미로운 일이 당신이 보통이 있다고 문제의 핵심.


OK - iOS는 다양한 색상을 통해 소용돌이 치는 그라디언트를 완벽하게 렌더링합니다.

이제 "0.3437 지점에서 무엇이 색상인가요?"라고 묻습니다.

어떻게 알 수 있습니까?

CAGradientLayer에 침을 뱉어 낼 방법이 있습니까?

반대로 (CAGradientLayer를 사용하지 않고) C 및 L에서 보간을 계산하는 방법이 있습니까?

(PS는, 그래, 난 당신이 렌더링에서 픽셀 색을 읽을 수 알고 있어요,. 여기가 아닌 질문) 나는 CAGradientLayer 생각하지 않는다

답변

0

특정 당신에게 색상을 제공하는 옵션이 있습니다 포인트.

색상을 보간하기 위해, 다음을 수행 할 수 있습니다 : 시작과 끝 지점이 모두 같은 y 값을 가지고 있기 때문에

let point: CGFloat = 0.3437 

    let startPoint = gradientLayer.startPoint 
    let endPoint = gradientLayer.endPoint 

    let x = (endPoint.x - point)/(endPoint.x - startPoint.x) 

    if let start = gradientLayer.colors?.first, 
     let end = gradientLayer.colors?.last { 

     let startColorCGColor = start as! CGColor 
     let endColorCGColor = end as! CGColor 

     let startColor = UIColor(cgColor: startColorCGColor) 
     let endColor = UIColor(cgColor: endColorCGColor) 

     var startR: CGFloat = 0 
     var startG: CGFloat = 0 
     var startB: CGFloat = 0 
     var endR: CGFloat = 0 
     var endG: CGFloat = 0 
     var endB: CGFloat = 0 
     startColor.getRed(&startR, green: &startG, blue: &startB, alpha: nil) 
     endColor.getRed(&endR, green: &endG, blue: &endB, alpha: nil) 

     let r,g,b: CGFloat 

     if x <= 0 { 
      r = startR 
      g = startG 
      b = startB 
     } else if x >= 1 { 
      r = endR 
      g = endG 
      b = endB 
     } else { 
      r = x * startR + (1.0 - x) * endR 
      g = x * startG + (1.0 - x) * endG 
      b = x * startB + (1.0 - x) * endB 
     } 

     print("R,G,B = \(r),\(g),\(b)") // This is the result. 
    } 

그러나이 코드는, 코드에 적용됩니다.

+0

아! 그건 너의 시간 낭비 였어, 타와 - 미안해. .startPoint, .endPoint는 아무것도 아닙니다. 문제는 .locations 배열에있는 수십 개의 점을 상상해보십시오 !!! – Fattie

+0

@Fattie 괜찮습니다. 알고리즘을 업데이트하여 여러 점을 허용 할 수 있습니다. 그렇지 않으면 귀하의 질문에서 언급 한 것처럼 픽셀을 얻는 것이 유일한 방법이라고 생각합니다. – TawaNicolas

관련 문제