- Android
在Android开发当中,我们通常是使用16进制的颜色值,AndroidStudio也给了"#FFFFFF"
形式的值一个很好的预览
在代码当中我们可以这样生成int型的color值
int color = Color.parseColor("#FFFFFF");
IOS
而在IOS开发的UIColor类中,却没有能传入16进制字符串值的构造方法
而我们需要实现这种16进制生成UIColor怎么办,当然可以用Swift语法当中非常强大的扩展
参考http://blog.youkuaiyun.com/pointee/article/details/52276588
实现方式大体一致,当然这个博主没有考虑到透明度的变化,我这里稍微改进下
extension UIColor {
convenience init(hexColor: String) {
let length = hexColor.lengthOfBytes(using: .utf8)
print(length)
if length != 7 && length != 9 {
self.init(red: 1.0, green: 0, blue: 0, alpha: 1.0)
return
}
//是否设置了透明度
let isHaveAlpha: Bool = length == 9
let r: Int = isHaveAlpha ? 3 : 1
let g: Int = isHaveAlpha ? 5 : 3
let b: Int = isHaveAlpha ? 7 : 5
// 存储转换后的数值
var red: UInt32 = 0, green: UInt32 = 0, blue: UInt32 = 0, alpha: UInt32 = 255
// 分别进行转换
if isHaveAlpha {
Scanner(string: hexColor[1..<r]).scanHexInt32(&alpha)
}
Scanner(string: hexColor[r..<g]).scanHexInt32(&red)
Scanner(string: hexColor[g..<b]).scanHexInt32(&green)
Scanner(string: hexColor[b..<length]).scanHexInt32(&blue)
print("\(CGFloat(red) / 255.0):\(CGFloat(green) / 255.0):\(CGFloat(blue) / 255.0):\(CGFloat(alpha) / 255.0)")
self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: CGFloat(alpha) / 255.0)
}
}
当然还需要对String扩展
extension UIColor {
/// String使用下标截取字符串
subscript (r: Range<Int>) -> String {
get {
let startIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
let endIndex = self.index(self.startIndex, offsetBy: r.upperBound)
return self[startIndex..<endIndex]
}
}
}
- 测试
在视图中放置两个View
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blue
let oneColor = UIColor(red: 1.0, green: 0, blue: 0, alpha: 0.1)
one.backgroundColor = oneColor
let twoColor = UIColor(hexColor: "#20ff0000")
two.backgroundColor = twoColor
}
效果如下 随便测试下,哈哈哈