美文网首页iOS(Swift)小课堂
Swift - 十六进制颜色字符串与UIColor之间的相互转换

Swift - 十六进制颜色字符串与UIColor之间的相互转换

作者: 1b3bd36d9d21 | 来源:发表于2019-08-19 10:47 被阅读1次

    项目开发中我们需要通过 16 进制颜色字符串(比如:#F0FFFF)来初始化 UIColor,或者将 UIColor 转成 16 进制字符串打印或显示出来。下面是如何实现。

    1.扩展 UIColor

    为方便使用,我们首先对 UIColor 进行扩展(UIColor+Ext.swift),增加相关的转换方法和属性

    import UIKit
     
    extension UIColor {
         
        // Hex String -> UIColor
        convenience init(hexString: String) {
            let hexString = hexString.trimmingCharacters(in: .whitespacesAndNewlines)
            let scanner = Scanner(string: hexString)
             
            if hexString.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 -> Hex String
        var hexString: String? {
            var red: CGFloat = 0
            var green: CGFloat = 0
            var blue: CGFloat = 0
            var alpha: CGFloat = 0
             
            let multiplier = CGFloat(255.999999)
             
            guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
                return nil
            }
             
            if alpha == 1.0 {
                return String(
                    format: "#%02lX%02lX%02lX",
                    Int(red * multiplier),
                    Int(green * multiplier),
                    Int(blue * multiplier)
                )
            }
            else {
                return String(
                    format: "#%02lX%02lX%02lX%02lX",
                    Int(red * multiplier),
                    Int(green * multiplier),
                    Int(blue * multiplier),
                    Int(alpha * multiplier)
                )
            }
        }
    }
    
    2.使用方法
    import UIKit
     
    class ViewController: UIViewController {
         
        override func viewDidLoad() {
            super.viewDidLoad()
             
            // 16进制颜色 -> UIColor
            let color = UIColor(hexString: "#FFFFFF")
            print("UIColor:", color)
             
            // UIColor -> 16进制颜色
            let hexString = color.hexString
            print("16进制颜色值:", hexString ?? "")
        }
    }
    

    相关文章

      网友评论

        本文标题:Swift - 十六进制颜色字符串与UIColor之间的相互转换

        本文链接:https://www.haomeiwen.com/subject/ujshpftx.html