gpt4 book ai didi

ios - 实际上 "calculate"是沿 CAGradientLayer 的一点的颜色?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:22:08 25 4
gpt4 key购买 nike

这里有一件有趣的事情,假设你有通常的......

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

最佳答案

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

关于ios - 实际上 "calculate"是沿 CAGradientLayer 的一点的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47138815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com