有时候项目的最低系统低于13.0,那么适配暗黑模式,或使用系统颜色时,需要各种类似#available(iOS 13.0, *)
这样的判断。
因此需要封装一下系统的api以便能兼容低系统
下面是我封装的相关扩展
extension UIColor {
static let black3 = UIColor(hex: "#333")
static let black6 = UIColor(hex: "#666")
static let black9 = UIColor(hex: "#999")
static var random: UIColor {
let r = arc4random_uniform(256)
let g = arc4random_uniform(256)
let b = arc4random_uniform(256)
return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: 1)
}
convenience init(rgb r: CGFloat, _ g: CGFloat, _ b: CGFloat, _ a: CGFloat = 1) {
self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: a)
}
convenience init(gray v: CGFloat) {
self.init(red: v / 255.0, green: v / 255.0, blue: v / 255.0, alpha: 1)
}
convenience init(hex string: String, alpha: CGFloat = 1.0) {
var hex = string.hasPrefix("#") ? String(string.dropFirst()) : string
guard hex.count == 3 || hex.count == 6 else {
self.init(white: 1.0, alpha: 0.0)
return
}
if hex.count == 3 {
for (indec, char) in hex.enumerated() {
hex.insert(char, at: hex.index(hex.startIndex, offsetBy: indec * 2))
}
}
self.init(
red: CGFloat((Int(hex, radix: 16)! >> 16) & 0xFF) / 255.0,
green: CGFloat((Int(hex, radix: 16)! >> 8) & 0xFF) / 255.0,
blue: CGFloat((Int(hex, radix: 16)!) & 0xFF) / 255.0,
alpha: alpha
)
}
static func gray(_ value: CGFloat) -> UIColor {
return UIColor(gray: value)
}
static func dynamicGray(_ v: CGFloat) -> UIColor {
if #available(iOS 13.0, *) {
return UIColor { (t) -> UIColor in
return t.userInterfaceStyle == .dark ? UIColor.gray(255 - v) : UIColor.gray(v)
}
}else {
return UIColor.gray(v)
}
}
static func dynamicColor(_ lColor: UIColor, dColor: UIColor) -> UIColor {
if #available(iOS 13.0, *) {
return UIColor { (t) -> UIColor in
return t.userInterfaceStyle == .dark ? dColor : lColor
}
}else {
return lColor
}
}
///重写iOS13的一些属性,让其对13以下系统适配
class var systemIndigo: UIColor {
let lColor = UIColor(red: 0.34, green: 0.34, blue: 0.84, alpha: 1)
let dColor = UIColor(red: 0.37, green: 0.36, blue: 0.9, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemGray2: UIColor {
let lColor = UIColor(red: 0.68, green: 0.68, blue: 0.70, alpha: 1)
let dColor = UIColor(red: 0.39, green: 0.39, blue: 0.40, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemGray3: UIColor {
let lColor = UIColor(red: 0.78, green: 0.78, blue: 0.80, alpha: 1)
let dColor = UIColor(red: 0.28, green: 0.28, blue: 0.29, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemGray4: UIColor {
let lColor = UIColor(red: 0.82, green: 0.82, blue: 0.84, alpha: 1)
let dColor = UIColor(red: 0.23, green: 0.23, blue: 0.24, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemGray5: UIColor {
let lColor = UIColor(red: 0.9, green: 0.9, blue: 0.92, alpha: 1)
let dColor = UIColor(red: 0.17, green: 0.17, blue: 0.18, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemGray6: UIColor {
let lColor = UIColor(red: 0.95, green: 0.95, blue: 0.97, alpha: 1)
let dColor = UIColor(red: 0.11, green: 0.11, blue: 0.12, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var label: UIColor {
let lColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1)
let dColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var secondaryLabel: UIColor {
let lColor = UIColor(red: 0.24, green: 0.24, blue: 0.26, alpha: 0.6)
let dColor = UIColor(red: 0.92, green: 0.92, blue: 0.96, alpha: 0.6)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var tertiaryLabel: UIColor {
let lColor = UIColor(red: 0.24, green: 0.24, blue: 0.26, alpha: 0.3)
let dColor = UIColor(red: 0.92, green: 0.92, blue: 0.96, alpha: 0.3)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var quaternaryLabel: UIColor {
let lColor = UIColor(red: 0.24, green: 0.24, blue: 0.26, alpha: 0.18)
let dColor = UIColor(red: 0.92, green: 0.92, blue: 0.96, alpha: 0.18)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var link: UIColor {
let lColor = UIColor(red: 0.0, green: 0.48, blue: 1, alpha: 1)
let dColor = UIColor(red: 0.04, green: 0.52, blue: 1, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var placeholderText: UIColor {
let lColor = UIColor(red: 0.24, green: 0.24, blue: 0.26, alpha: 0.3)
let dColor = UIColor(red: 0.92, green: 0.92, blue: 0.96, alpha: 0.3)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var separator: UIColor {
let lColor = UIColor(red: 0.24, green: 0.24, blue: 0.26, alpha: 0.29)
let dColor = UIColor(red: 0.33, green: 0.33, blue: 0.35, alpha: 0.6)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var opaqueSeparator: UIColor {
let lColor = UIColor(red: 0.78, green: 0.78, blue: 0.78, alpha: 1)
let dColor = UIColor(red: 0.22, green: 0.22, blue: 0.23, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemBackground: UIColor {
let lColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
let dColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var secondarySystemBackground: UIColor {
let lColor = UIColor(red: 0.95, green: 0.95, blue: 0.97, alpha: 1)
let dColor = UIColor(red: 0.11, green: 0.11, blue: 0.12, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var tertiarySystemBackground: UIColor {
let lColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
let dColor = UIColor(red: 0.17, green: 0.17, blue: 0.18, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemGroupedBackground: UIColor {
let lColor = UIColor(red: 0.95, green: 0.95, blue: 0.97, alpha: 1)
let dColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var secondarySystemGroupedBackground: UIColor {
let lColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1)
let dColor = UIColor(red: 0.11, green: 0.11, blue: 0.12, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var tertiarySystemGroupedBackground: UIColor {
let lColor = UIColor(red: 0.95, green: 0.95, blue: 0.97, alpha: 1)
let dColor = UIColor(red: 0.17, green: 0.17, blue: 0.18, alpha: 1)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var systemFill: UIColor {
let lColor = UIColor(red: 0.47, green: 0.47, blue: 0.5, alpha: 0.2)
let dColor = UIColor(red: 0.47, green: 0.47, blue: 0.5, alpha: 0.36)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var secondarySystemFill: UIColor {
let lColor = UIColor(red: 0.47, green: 0.47, blue: 0.5, alpha: 0.16)
let dColor = UIColor(red: 0.47, green: 0.47, blue: 0.5, alpha: 0.32)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var tertiarySystemFill: UIColor {
let lColor = UIColor(red: 0.46, green: 0.46, blue: 0.5, alpha: 0.12)
let dColor = UIColor(red: 0.46, green: 0.46, blue: 0.5, alpha: 0.24)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
class var quaternarySystemFill: UIColor {
let lColor = UIColor(red: 0.45, green: 0.45, blue: 0.5, alpha: 0.08)
let dColor = UIColor(red: 0.46, green: 0.46, blue: 0.5, alpha: 0.18)
if #available(iOS 13.0, *) {
return .dynamicColor(lColor, dColor: dColor)
}else {
return lColor
}
}
}