Swift - 十六进制颜色字符串与UIColor之间的相互转换(附样例)
作者:hangge | 2019-03-08 08:11
有时我们需要通过 16 进制颜色字符串(比如:#C0C0C0)来初始化 UIColor,或者将 UIColor 转成 16 进制字符串打印或显示出来。下面通过样例演示这个转换如何实现。
(2)运行结果如下:
1,扩展 UIColor
为方便使用,我们首先对 UIColor 进行扩展(UIColor+.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,使用样例
(1)样例代码
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 16进制颜色 -> UIColor
let color = UIColor(hexString: "#C0C0C0")
print("UIColor:", color)
// UIColor -> 16进制颜色
let hexString = color.hexString
print("16进制颜色值:", hexString ?? "")
}
}
(2)运行结果如下:
全部评论(0)