在做开发的时候,企划给的企划案里的颜色,可能是类似0x000000这样的字符串,或者我们根据屏幕颜色做拾取的时候,也是得到类似这样的字符串,但是我们在代码里生成UIColor的时候,就没有那么简单的方法,直接从0xFFFFFF这样构造出UIColor,UIColor的构造方法,需要RBGA4个参数,对我们程序员来说转换相对麻烦一点,并且后面再看看代码的时候,光从 rbg 的数值,也不能一眼看出来是什么:
UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
下面分享我自用的 Extension,让 UIColor 的构造方法可以接收字符串类型,支持0xRGB或者0xARGB,就是带透明度 aplha 通道
import UIKit
extension UIColor {
convenience init?(rgba: String) {
var r: CGFloat = 0.0
var g: CGFloat = 0.0
var b: CGFloat = 0.0
var a: CGFloat = 1.0
if rgba.hasPrefix("#") {
let fromIndex = rgba.index(rgba.startIndex, offsetBy: 1)
let hexColor = String(rgba[fromIndex...])
let scanner = Scanner(string: hexColor)
var hexNumber: CUnsignedLongLong = 0
if scanner.scanHexInt64(&hexNumber) {
if hexColor.count == 6 {
r = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255.0
g = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255.0
b = CGFloat(hexNumber & 0x000000ff) / 255.0
} else if(hexColor.count == 8) {
a = CGFloat((hexNumber & 0xFF000000) >> 24) / 255.0
r = CGFloat((hexNumber & 0x00FF0000) >> 16) / 255.0
g = CGFloat((hexNumber & 0x0000FF00) >> 8) / 255.0
b = CGFloat(hexNumber & 0x000000FF) / 255.0
}
self.init(red: r, green: g, blue: b, alpha: a)
return
}
}
return nil
}
}
使用方法
//带 alpha 通道的 var color = UIColor(rgba: "#88663D45") //不带 alpha 通道的 color = UIColor(rgba: "#663D45")
另外如果你肯定用不到 alpha通道,可以更加简单一些,我写了个示例方法(传入 rgb 的 Int 值,传出非可选的 UIColor),也可以自行改造成 Extension,如下:
func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
//如何使用:
let color = UIColorFromRGB(0x663D45)
文章评论