阅读 295

在 swift 里扩展 UIColor 使用十六进制颜色值

4.2. The RGB hexadecimal notations: #RRGGBB

十六进制颜色表示方式是 #RRGGBB(6位),带 alpha 的表示方式是 #RRGGBBAA(8位)
取值范围是 00 - FF

十六进制颜色缩写的表示方式是 #RGB(3位),带 alpha 的表示方式是 #RGBA(4位)
取值范围是 0 - F,缩略的规则和前三位相同

基于以上知识,对 UIColor 添加一个扩展方法,支持直接传入十六进制颜色,Swift 版本:

extension UIColor {
    static func hex(_ val: UInt) -> UIColor {
        var r: UInt = 0, g: UInt = 0, b: UInt = 0;
        var a: UInt = 0xFF
        var rgb = val

        if (val & 0xFFFF0000) == 0 {
            a = 0xF

            if val & 0xF000 > 0 {
                a = val & 0xF
                rgb = val >> 4
            }

            r = (rgb & 0xF00) >> 8
            r = (r << 4) | r

            g = (rgb & 0xF0) >> 4
            g = (g << 4) | g

            b = rgb & 0xF
            b = (b << 4) | b

            a = (a << 4) | a

        } else {
            if val & 0xFF000000 > 0 {
                a = val & 0xFF
                rgb = val >> 8
            }

            r = (rgb & 0xFF0000) >> 16
            g = (rgb & 0xFF00) >> 8
            b = rgb & 0xFF
        }

        //NSLog("r:%X g:%X b:%X a:%X", r, g, b, a)

        return UIColor(red: CGFloat(r) / 255.0,
                       green: CGFloat(g) / 255.0,
                       blue: CGFloat(b) / 255.0,
                       alpha: CGFloat(a) / 255.0)
    }
}
复制代码

使用的时候很方便:

例如颜色是 #FFAABB

6 位颜色值

let color: UIColor = .hex(0xFFAABB)
复制代码

8 位带透明度,设置透明度是 0xDD

let color: UIColor = .hex(0xFFAABBDD)
复制代码

3 位颜色值

let color: UIColor = .hex(0xFAB)
复制代码

4 位带透明度,设置透明度是 0xDD

let color: UIColor = .hex(0xFABD)
复制代码

可以直接和设计图里的颜色 #FFAABB 对应起来,查询和使用都非常方便。