今天在写项目的时候遇到这么个问题,需要将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
}
}
希望上面的代码可以帮助到需要的朋友。