这是一件有趣的事情,假设你有平常的......
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/