Swift 16进制字符串与UIColor互转

程谦
2023-12-01

今天在写项目的时候遇到这么个问题,需要将UIColor转成16进制字符串,然后写入沙盒进行本地缓存,于是一番操作下,给UIColor加了两个扩展。

第一个convenience init方法并不陌生,通过16进制字符串创建UIColor,在一些项目设计稿中很多颜色都是以16进制的方式标注的,所以将16进制字符串转成UIColor的方法也是大同小异的。

第二个方法则是将UIColor转成16进制字符串,这个在项目当中并不多见,这个方法在我的项目中亲测有效。

以下两个方法,特此记录一下,俗话说好记性不如烂笔头。

public extension UIColor {
    
    /// 通过16进制的字符串创建UIColor
    ///
    /// - Parameter hex: 16进制字符串,格式为#ececec
    convenience init (hex: String) {
        let hex = (hex as NSString).trimmingCharacters(in: .whitespacesAndNewlines)
        let scanner = Scanner(string: hex)
        
        if hex.hasPrefix("#") {
            scanner.scanLocation = 1
        }
        
        var color: UInt32 = 0
        scanner.scanHexInt32(&color)
        
        let mask = 0x000000FF
        let r = Int(color >> 16) & mask
        let g = Int(color >> 8) & mask
        let b = Int(color) & mask
        
        let red   = CGFloat(r) / 255.0
        let green = CGFloat(g) / 255.0
        let blue  = CGFloat(b) / 255.0
        self.init(red: red, green: green, blue: blue, alpha: 1)
    }

    
    /// 将UIColor转换为16进制字符串。
    func toHexString() -> String {
        let components = self.cgColor.components
        let r: CGFloat = components?[0] ?? 0.0
        let g: CGFloat = components?[1] ?? 0.0
        let b: CGFloat = components?[2] ?? 0.0

        let hexString = String(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)))
        return hexString
    }
}

希望上面的代码可以帮助到需要的朋友。

 类似资料: