在做开发的时候,企划给的企划案里的颜色,可能是类似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)
文章评论