当前位置: > > > Swift - CAGradientLayer渐变动画的实现1(渐变特效、动态光泽文字)

Swift - CAGradientLayer渐变动画的实现1(渐变特效、动态光泽文字)

在之前的文章中我简单地介绍了 CAGradientLayer 的使用。CAGradientLayer 对象最主要就是如下4个属性:
  • colors:颜色数组,定义渐变层的各个颜色。
  • locations(可选):决定每个渐变颜色的终止位置,这些值必须是递增的,数组的长度和 colors 的长度最好一致。
  • startPoint(可选):渲染的起始位置,默认值是:[.5,0]
  • endPoint(可选):渲染的终止位置,默认值是:[.5,1]
而且这 4 个属性都是可以进行动画的。本文演示它们如何结合 CABasicAnimation 实现各种渐变动画效果。

一、colors 变化动画

1,效果图

每次点击一下屏幕,背景渐变色就会切换成下一组,同时颜色在改变过程中还会有动画效果。
                

2,样例代码

import UIKit

class ViewController: UIViewController, CAAnimationDelegate {
    
    //共三组渐变色
    let colorsSet = [
        [UIColor.yellow.cgColor, UIColor.orange.cgColor],
        [UIColor.cyan.cgColor, UIColor.green.cgColor],
        [UIColor.magenta.cgColor, UIColor.blue.cgColor],
    ]
    
    //当前渐变色索引
    var currentIndex = 0
    
    //渐变层
    var gradientLayer:CAGradientLayer!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //单击监听
        let tapSingle=UITapGestureRecognizer(target:self,action:#selector(tapSingleDid))
        tapSingle.numberOfTapsRequired = 1
        tapSingle.numberOfTouchesRequired = 1
        self.view.addGestureRecognizer(tapSingle)

        //创建CAGradientLayer对象
        gradientLayer = CAGradientLayer()
        //设置初始渐变色
        gradientLayer.colors = colorsSet[0]
        //每种颜色所在的位置
        gradientLayer.locations = [0.0, 1.0]
        
        //设置其CAGradientLayer对象的frame,并插入view的layer
        gradientLayer.frame = self.view.frame
        self.view.layer.insertSublayer(gradientLayer, at: 0)
    }
    
    func tapSingleDid(){
        //下一组渐变色索引
        var nextIndex = currentIndex + 1
        if nextIndex >= colorsSet.count {
            nextIndex = 0
        }
        
        //添加渐变动画
        let colorChangeAnimation = CABasicAnimation(keyPath: "colors")
        colorChangeAnimation.delegate = self
        colorChangeAnimation.duration = 2.0
        colorChangeAnimation.fromValue = colorsSet[currentIndex]
        colorChangeAnimation.toValue = colorsSet[nextIndex]
        colorChangeAnimation.fillMode = kCAFillModeForwards
        //动画结束后保持最终的效果
        colorChangeAnimation.isRemovedOnCompletion = false
        gradientLayer.add(colorChangeAnimation, forKey: "colorChange")
        
        //动画播放后改变当前索引值
        currentIndex = nextIndex
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

二、locations 变化动画

1,效果图

(1)下面实现一个动态光泽效果,类似苹果手机过去滑动解锁文字的效果。
(2)文字从左到右会有光泽闪过。闪到最右侧时,又从左侧开始重复播放动画。
          

2,实现方式

(1)CAGradientLayer 从左到右使用黑、白、黑渐变。
(2)动画通过改变 CAGradientLayer locations,从而实现白色部分从左向右移动。
(3)最后将 UILabel 上的文字作为 CAGradientLayer 的遮罩即可,看起来就像是文字会有动态光泽效果。

3,实现步骤

(1)首先在 StroyBoard 中添加一个 UIView(后面会将渐变层添加到这个 view 里面)。设置好位置约束,并在代码中添加 @IBOutlet 关联。

(2)接着在刚才添加的 UIView 中添加一个 UILabel。设置好位置约束,并在代码中添加 @IBOutlet 关联。

(3)主视图控制器完整代码如下:
import UIKit

class ViewController: UIViewController {
    
    //文本标签
    @IBOutlet weak var label: UILabel!
    
    //文本标签背景
    @IBOutlet weak var labelBg: UIView!
    
    //渐变层
    var gradientLayer:CAGradientLayer!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //将主视图背景设置为灰色
        self.view.backgroundColor = UIColor.darkGray
        
        //创建CAGradientLayer对象
        self.gradientLayer = CAGradientLayer()
        
        //设置初始渐变色
        self.gradientLayer.colors = [UIColor.black.cgColor,
                                     UIColor.white.cgColor,
                                     UIColor.black.cgColor]
        
        //设置每种颜色初始所在的位置
        self.gradientLayer.locations = [0, 0, 0.25]
        
        //设置渲染的起始结束位置(横向渐变)
        self.gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
        self.gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
        
        //设置其CAGradientLayer对象的frame,并插入view的layer
        self.gradientLayer.frame = CGRect(x: 0, y: 0,
                                          width: labelBg.frame.size.width,
                                          height: labelBg.frame.size.height)
        
        //将渐变层添加到文本标签背景上
        self.labelBg.layer.insertSublayer(gradientLayer, at: 0)
        
        //添加渐变动画(让白色光泽从左向右移动)
        let gradientAnimation = CABasicAnimation(keyPath: "locations")
        gradientAnimation.fromValue = [0, 0, 0.2]
        gradientAnimation.toValue = [0.8, 1, 1]
        gradientAnimation.duration = 12.5
        //动画一致重复执行
        gradientAnimation.repeatCount = HUGE
        self.gradientLayer.add(gradientAnimation, forKey: nil)
        
        //设置遮罩,让渐变层透过文字显示出来
        self.labelBg.mask = self.label
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
源码下载hangge_1769.zip
评论0