什么是 CALayer 和 CAGradientLayer?

Posted

技术标签:

【中文标题】什么是 CALayer 和 CAGradientLayer?【英文标题】:What is CALayer and CAGradientLayer? 【发布时间】:2020-12-28 22:07:52 【问题描述】:

谁能用简单的语言解释一下什么是 CALayer 和 CAGradientLayer 以及如何以编程方式实现以下渐变。

我想以编程方式实现这种渐变色:

【问题讨论】:

【参考方案1】:

我建议您搜索 CALayerCAGradientLayer 并阅读它们是什么以及如何使用它们。

不过,举个非常简单的例子……

CAGradientLayer 使用一组颜色(CGColor 类型),结合一组位置(颜色应更改的百分比)以及起点和终点。

因此,要获得颜色渐变,您需要一组颜色:

[.purple, .blue, .green, .yellow, .red]

位置数组:

[0.0, 0.2, 0.4, 0.6, 1.0]

你想从顶部开始并在底部结束:

gradLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
gradLayer.endPoint = CGPoint(x: 0.5, y: 1.0)

这是一个简单的例子:

class ViewController: UIViewController 
    
    let gradLayer = CAGradientLayer()
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        let myColors: [UIColor] = [.purple, .blue, .green, .yellow, .red]
        
        // assign the colors (we're using map to convert UIColors to CGColors)
        gradLayer.colors = myColors.map($0.cgColor)
        
        // locations can be considered Percentages
        // so, 0.2 is 20%, 0.4 is 40%, etc
        gradLayer.locations = [0.0, 0.2, 0.4, 0.6, 1.0]
        
        // start at the top
        gradLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
        
        // end at the bottom
        gradLayer.endPoint = CGPoint(x: 0.5, y: 1.0)

        view.layer.addSublayer(gradLayer)
        
    
    
    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()
        // layers do not auto-size, so update the frame
        gradLayer.frame = view.bounds
    


结果:

使用位置和颜色来查看差异。

【讨论】:

嘿@DonMag 谢谢你的回答,你能不能也谈谈那个 viewDidLayoutSubviews() 函数,比如它什么时候被调用,被调用了多少次? @YuvrajAgarkar - 这是基本的 ios 开发。最好的办法是阅读文档。

以上是关于什么是 CALayer 和 CAGradientLayer?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 中 UIView 和 CALayer 的关系

CGLayer和CALayer有啥区别和兼容性?

使用 UIView 或 CALayer 绘制和动画?

CALayer及其子类

什么时候可以使用 CALayer.timeOffset

CALayer动画