Swift - CAGradientLayer使用详解1(实现渐变色背景)
作者:hangge | 2017-08-28 08:10
对于程序主视图 view 或者其它任意的 UIView,通过 backgroundColor 属性可以将其背景设置为指定颜色。但这种方式只能设置纯色背景。如果想要实现渐变色背景,一种方法是使用 Core Graphics 绘图框架来直接绘制填充,这个我之前也写过相关文章:Swift - Core Graphics绘图框架详解3(绘制渐变、填充渐变色)

(2)效果图如下:
本文介绍另一种更简单的方法:使用 CAGradientLayer 来实现渐变背景。
1,基本介绍
(1)CAGradientLayer 是 CALayer 的子类,可以理解为一个渐变层。如果使用的是透明的颜色,还可以做到透明渐变。(2)CAGradientLayer 目前只能实现线性渐变,还不能实现放射性渐变。
(3)CAGradientLayer 对象最主要的就是如下 4 个属性:
- colors:颜色数组,定义渐变层的各个颜色。
- locations(可选):决定每个渐变颜色的终止位置,这些值必须是递增的,数组的长度和 colors 的长度最好一致。
- startPoint(可选):渲染的起始位置,默认值是:[.5,0](具体坐标系参考下图)
- endPoint(可选):渲染的终止位置,默认值是:[.5,1](具体坐标系参考下图)

2,实现一个双色的渐变背景
(1)下面代码将我们主视图 View 的背景设置成从黄色过渡到橙色的渐变色(方向为默认的自上而下)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//定义渐变的颜色(从黄色渐变到橙色)
let topColor = UIColor(red: 0xfe/255, green: 0xd3/255, blue: 0x2f/255, alpha: 1)
let buttomColor = UIColor(red: 0xfc/255, green: 0x68/255, blue: 0x20/255, alpha: 1)
let gradientColors = [topColor.cgColor, buttomColor.cgColor]
//定义每种颜色所在的位置
let gradientLocations:[NSNumber] = [0.0, 1.0]
//创建CAGradientLayer对象并设置参数
let gradientLayer = CAGradientLayer()
gradientLayer.colors = gradientColors
gradientLayer.locations = gradientLocations
//设置其CAGradientLayer对象的frame,并插入view的layer
gradientLayer.frame = self.view.frame
self.view.layer.insertSublayer(gradientLayer, at: 0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
(2)效果图如下:

3,多种颜色的渐变
(1)下面代码再多添加几种颜色,实现类似彩虹的渐变效果。同时将渐变方向改成从左到右。
(2)效果图如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//定义渐变的颜色(7种彩虹色)
let gradientColors = [UIColor.red.cgColor,
UIColor.orange.cgColor,
UIColor.yellow.cgColor,
UIColor.green.cgColor,
UIColor.cyan.cgColor,
UIColor.blue.cgColor,
UIColor.purple.cgColor]
//定义每种颜色所在的位置
let gradientLocations:[NSNumber] = [0.0, 0.17, 0.33, 0.5, 0.67, 0.83, 1.0]
//创建CAGradientLayer对象并设置参数
let gradientLayer = CAGradientLayer()
gradientLayer.colors = gradientColors
gradientLayer.locations = gradientLocations
//设置渲染的起始结束位置(横向渐变)
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 0)
//设置其CAGradientLayer对象的frame,并插入view的layer
gradientLayer.frame = self.view.frame
self.view.layer.insertSublayer(gradientLayer, at: 0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
(2)效果图如下:

4,扩展渐变类实现代码复用
(1)如果有多个 view 需要使用相同的渐变背景,每个视图都重复设置一遍会很麻烦。我们可以对 CAGradientLayer 类进行扩展,增加一个方法实现相关属性的自动设置。
(2)使用时只需要调用该方法即可。
import UIKit
extension CAGradientLayer {
//获取彩虹渐变层
func rainbowLayer() -> CAGradientLayer {
//定义渐变的颜色(7种彩虹色)
let gradientColors = [UIColor.red.cgColor,
UIColor.orange.cgColor,
UIColor.yellow.cgColor,
UIColor.green.cgColor,
UIColor.cyan.cgColor,
UIColor.blue.cgColor,
UIColor.purple.cgColor]
//定义每种颜色所在的位置
let gradientLocations:[NSNumber] = [0.0, 0.17, 0.33, 0.5, 0.67, 0.83, 1.0]
//创建CAGradientLayer对象并设置参数
self.colors = gradientColors
self.locations = gradientLocations
//设置渲染的起始结束位置(横向渐变)
self.startPoint = CGPoint(x: 0, y: 0)
self.endPoint = CGPoint(x: 1, y: 0)
return self
}
}
(2)使用时只需要调用该方法即可。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//获取彩虹渐变层
let gradientLayer = CAGradientLayer().rainbowLayer()
//设置彩虹渐变层的frame,并插入view的layer
gradientLayer.frame = self.view.frame
self.view.layer.insertSublayer(gradientLayer, at: 0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
全部评论(2)
航哥,建议将渐变层的frame.origin设置为CGPoint.zero,不然在为单个控件设置渐变色的时候,渐变层会出现偏移。
站长回复:嗯,这个要具体情况具体分析。
航哥,怎么设置背景色为渐变色的按钮,给button的layer用这个办法不行。
站长回复: