实际上"计算"沿CAGradientLayer的某个点的颜色?

时间:2017-11-06 14:08:47

标签: ios cagradientlayer cgcolor

这是一件有趣的事,说你有平常......

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数组(以及匹配的颜色一个)可能有数十个或数百个条目,问题的核心。

好的 - iOS将完美渲染渐变,旋转各种颜色。

现在说我然后在0.3437点问"是什么颜色"吗

如何得到它?

CAGradientLayer是否有办法吐出来?

相反(不使用CAGradientLayer),有没有办法计算C和L中的插值?

(PS,是的,我知道你可以从渲染中读取像素颜色;这里不是问题。)

1 个答案:

答案 0 :(得分:1)

我不认为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值。