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用这个办法不行。
站长回复: