UIColor添加十六进制初始化扩展

实际开发中,我们拿到的设计稿上的颜色标注往往是十六进制的,但是系统中只提供了 RGB 生成颜色的方法,这里我们为 UIColor 添加了一个扩展,支持利用字符串或者 UInt 直接创建 UIColor 对象。

  • 创建文件
  • 添加扩展方法
    • 通过 UInt 创建
    • 通过 String 创建
  • 调用

创建文件

在项目中添加一个编写扩展代码的文件,命名为 UIColor+Helper.swift。

添加扩展方法

在第一步创建的文件中添加下方几个扩展的方法。

convenience:便利构造器,使用 convenience 修饰的构造函数叫做便利构造函数,便利构造函数通常用在对系统的类进行构造函数的扩充时使用。

便利构造函数的特点:
1、便利构造函数通常都是写在 extension 里面
2、便利函数 init 前面需要加载 convenience
3、在便利构造函数中需要明确的调用 self.init()

通过 UInt 创建

1
2
3
4
5
6
7
8
9
10
11
extension UIColor {
//用数值初始化颜色,便于生成设计图上标明的十六进制颜色
convenience init(valueRGB: UInt, alpha: CGFloat = 1.0) {
self.init(
red: CGFloat((valueRGB & 0xFF0000) >> 16) / 255.0,
green: CGFloat((valueRGB & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(valueRGB & 0x0000FF) / 255.0,
alpha: alpha
                )
}
}

通过 String 创建

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
35
36
37
38
39
40
41
extension UIColor {
convenience init(r: UInt32, g: UInt32, b: UInt32, a: CGFloat = 1.0) {
self.init(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: a)
}

class func hex(hexString: String) -> UIColor {
var cString: String = hexString.trimmingCharacters(in: .whitespacesAndNewlines)
if cString.count < 6 { return UIColor.black }

let index = cString.index(cString.endIndex, offsetBy: -6)
let subString = cString[index...]

if cString.hasPrefix("0X") {
cString = String(subString)
}
if cString.hasPrefix("#") {
cString = String(subString)
}

if cString.count != 6 {
return UIColor.black
}

var range = NSRange(location: 0, length: 2)
let rString = (cString as NSString).substring(with: range)
range.location = 2
let gString = (cString as NSString).substring(with: range)
range.location = 4
let bString = (cString as NSString).substring(with: range)

var r: UInt32 = 0x0
var g: UInt32 = 0x0
var b: UInt32 = 0x0

Scanner(string: rString).scanHexInt32(&r)
Scanner(string: gString).scanHexInt32(&g)
Scanner(string: bString).scanHexInt32(&b)

return UIColor(r: r, g: g, b: b)
}
}

调用

1
2
3
4
5
6
7
8
let testColor1 = UIColor(valueRGB: 0x666666, alpha: 1.0)
let testColor2 = UIColor.hex(hexString: "#666666")
let testColor3 = UIColor.hex(hexString: "0X666666")
let testColor4 = UIColor.hex(hexString: "666666")

---结果---

r 0.4 g 0.4 b 0.4 a 1.0