2017-11-06 12 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配列(およびマッチング色1)がエントリの数十または数百を持つことができる持っていると言います、問題の中心


OK - iOSは、さまざまな色で旋回するグラデーションを完全にレンダリングします。

ここで、私は"ポイント0.3437で、色は何ですか?"と質問しますか?

どうすればよいですか?

CAGradientLayerには吐き出す方法がありますか?

逆に(CAGradientLayerを使用しない場合)、CとLの補間を計算する方法はありますか?

(PSは、はい、私はあなたがレンダリングからのピクセルの色を読むことができる知っています;。ここにはいない質問)

答えて

0

私はCAGradientLayerが一定であなたに色を与えるためのオプションを持っているとは思いませんポイント。

色を補間するためには、次の操作を行うことができますが:

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. 
    } 

しかし、始点と終点が同じy値の両方を持っているので、このコードは唯一、あなたのコードのために働きます。

+0

Ah!それはあなたの時間のかなりの無駄でした、Tawa - 申し訳ありません。 .startPoint、.endPointは何もありません。問題は、.locations配列内の数十点を想像してみてください! – Fattie

+0

@Fattieいいですね。アルゴリズムを更新して、複数の点を受け入れることができます。さもなければ私はあなたの質問で言及したようなピクセルを得ることがあなたの唯一の賭けだと思う​​。 – TawaNicolas

関連する問題