颜色
系统提供的方法
- 我们用的最多的还是
RGBA
颜色系统,每个参数都是0到1的浮点数,只是类型是iOS
比较独特的CGFloat
public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
red, green, blue
: 取值是0到255之间的某个数,除以255之后的值,相对比较麻烦;一般
UI
给的颜色值是16进制的RGB
值,比如0x11BA66
之类的,再加上一个20%之类的透明度
颜色工具封装
- 把16进制的整数转化为10进制,并且取出
RGB
三个分量的值,可以比较方便调用系统方法;
UIColor(red: CGFloat((hexValue & 0xFF0000) >> 16) / 255, green: CGFloat((hexValue & 0x00FF00) >> 8) / 255, blue: CGFloat(hexValue & 0x0000FF) / 255, alpha: alphaValue)
- 整数的16进制表示也是比较麻烦的,最好是提供一个字符,比较方便;所以需要一个字符串转16进制整数的方法
Scanner(string: hexString).scanHexInt64(&hexValue)
- 透明度大多数情况是1,这个只要给个默认值就可以解决。最后的样子如下:
/// 16进制字符串转Color
public static func hexColor(_ inputString: String?, alpha: CGFloat = 1) -> UIColor {
// 默认给绿色
var hexValue: UInt64 = 0x11BA66
let hexString = inputString ?? "0x11BA66"
Scanner(string: hexString).scanHexInt64(&hexValue)
// 确保alpha的范围是0到1
var alphaValue = alpha
if alphaValue > 1 {
alphaValue = 1
}
if alphaValue < 0 {
alphaValue = 0
}
return UIColor(red: CGFloat((hexValue & 0xFF0000) >> 16) / 255, green: CGFloat((hexValue & 0x00FF00) >> 8) / 255, blue: CGFloat(hexValue & 0x0000FF) / 255, alpha: alphaValue)
}
渐变
系统提供的渐变太灵活了,项目中可以缩小适应范围,比如,只提供垂直方向两种颜色的渐变:
/// 在背景部分加渐变;需要等frame稳定
public static func addGradient(_ view: UIView, startColor: UIColor, endColor: UIColor) {
/// 渐变
/// https://www.jianshu.com/p/eca222b78a24
/// 渐变需要加到最底层,如果用addSulayer,会导致渐变加在最顶层,其他视图会被盖住
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
gradientLayer.frame = view.bounds
gradientLayer.locations = [0, 1]
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1)
view.layer.insertSublayer(gradientLayer, at: 0)
}
由于渐变用到
frame
参数,所以调用时机需要注意一下,比如viewDidLoad
的时候,frame
就还不确定,就不适合做渐变相关的事。除非固定frame
参数。