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

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

最佳答案

我认为 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/

相关文章:

iphone - performSelector :withObject:afterDelay: and dispatch_after 之间的权衡是什么

ios - UIActivityViewController - 插件 net.whatsapp.WhatsApp.ShareExtension 无效

ios - 在 Firebase 上保存和检索图像

ios - TableView背景渐变毛刺

iphone - iOS6以来按钮背景和渐变的变化

iphone - 得到了[Not A Type class]:消息发送到释放实例错误?

ios - UIButton.isSelected 不能 Observable

ios - 创建一个具有前导/尾随褪色边缘的 UIView

cocoa - 是否可以将 CGPattern 图像背景颜色锚定到 CALayer 的中心?

iphone - UIImageView 边框颜色