【问题标题】:Actually "calculate" the color at a point along a CAGradientLayer?实际上在沿 CAGradientLayer 的某个点“计算”颜色?
【发布时间】:2018-04-18 17:26:04
【问题描述】:

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

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,是的,我知道您可以从渲染中读取像素颜色;这里不是问题。)

【问题讨论】:

    标签: ios cagradientlayer cgcolor


    【解决方案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 值。

    【讨论】:

    • 啊!太浪费你的时间了,Tawa - 对不起。 .startPoint, .endPoint 什么都不是,问题是,想象一下 .locations 数组中的几十个点!!!
    • @Fattie 没关系。您始终可以更新算法以使其接受多个点。否则,我认为您唯一的选择就是获得您在问题中提到的像素。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多