在 Swift 中使用 UIColor 定义颜色是件麻烦事儿,你需要在初始化函数中给出 RGB 以及透明度的数值:

1
2
3
4
init(red: CGFloat, 
green: CGFloat,
blue: CGFloat,
alpha: CGFloat)

我们希望可以像 UIColor.black 这样快速访问我们自定义的颜色。extension UIColor 可以帮助我们实现这一功能。

什么是 extension?

extension 可以为一个类型添加新的功能,但不能重写已有的功能。

extension 可以完成:

  1. 添加计算属性(computed properties)
  2. 添加方法(methods)
  3. 添加初始化方法(initializers)
  4. 添加附属脚本(subscripts)
  5. 添加并使用嵌套类型(nested types)
  6. 遵循并实现某一协议(conform protocol)

创建一个 extension

我们可以在项目中创建一个 Extensions 文件夹来存放 extension 文件。

选择 File > New > File … > iOS > Swift File, 输入名称后创建一个文件。

文件名可以根据「扩展类名 + 功能介绍」的格式来取。例如为 UIColor 添加自定义颜色,文件名就可以定为 UIColorCustomColor.swift

通过 extension UIColor 自定义颜色

定义新增初始化方法

使用 convenience 关键字新增一个初始化 init 方法。

该方法接收三个 Int 类型参数:

  • red:红色光值(R)
  • green:绿色光值(G)
  • blue:蓝色光值(B)

而后根据这三个参数初始化 UIColor

1
2
3
4
5
6
7
8
9
10
11
import UIKit

extension UIColor {
// 新增初始化方法
convenience init(red: Int, green: Int, blue: Int) {
assert(red >= 0 && red <= 255, "Invalid red component")
assert(green >= 0 && green <= 255, "Invalid green component")
assert(blue >= 0 && blue <= 255, "Invalid blue component")
self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
}
}

定义自定义颜色结构体

使用 struct 定义一个名为 CustomColor 的颜色结构体,用于存放所有自定义颜色。

该结构体中又定义了不同颜色的结构体,例如 struct Blackstruct Gray,用于存放各自颜色类别下的具体颜色。

大致就是这个结构:

  • 自定义颜色
    • 黑色
      • 墨水黑
      • 非洲黑
      • 乌漆麻黑
      • ……
    • 灰色
      • 烟灰
      • 天灰灰
      • ……
    • 紫色
      • 基佬紫
      • ……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import UIKit

extension UIColor {
// 新增初始化方法
// ...

// 自定义颜色结构体
struct CustomColor {

// 黑色
struct Black {
static let SmokyBlack = UIColor(red: 13, green: 13, blue: 13)
}

// 灰色
struct Gray {
// 正常文字
static let GraniteGray = UIColor(red: 102, green: 102, blue: 110)
// 补充文字灰色
static let SpanishGray = UIColor(red: 153, green: 153, blue: 161)
// 补充文字灰色 2
static let LightGray = UIColor(red: 210, green: 210, blue: 212)
// 失去焦点灰色
static let Platinum = UIColor(red: 230, green: 230, blue: 233)

}

// 白色
struct White {
static let WhiteSmoke = UIColor(red: 247, green: 247, blue: 248)
static let Platinum = UIColor(red: 232, green: 237, blue: 223)
}
}
}

调用

上面已经定义好了一个自定义颜色结构体,调用方式如下:

1
bottomLine.backgroundColor = UIColor.CustomColor.Gray.LightGray.cgColor

参考资料