这是一件有趣的事,说你有平常......
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,是的,我知道你可以从渲染中读取像素颜色;这里不是问题。)
答案 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
值。