コードからダークモードに対応する色を指定するのが記述量多くて大変だったので、まさに convenience な extension を書きました
※ 以下 if #available(iOS 13, *)
な分岐は省いて書きます
前提
iOS 13からのダークモード対応のコツ などで
class func dynamicColor(light: UIColor, dark: UIColor) -> UIColor
と定義しているのを真似していたのですが、今後 UIColor を使うときは、ほぼ dynamicProvider 使うかなーと思って init に寄せました
extension UIColor {
convenience init(light: UIColor, dark: UIColor) {
self.init {
if $0.userInterfaceStyle == .dark {
return dark
} else {
return light
}
}
}
}
let color = UIColor.dynamicColor(...)
って書くか
let color = UIColor(...)
って書くかの違いなので好みの問題かなと
グレースケール
extension UIColor {
convenience init(dynamicWhite white: CGFloat, alpha: CGFloat) {
self.init(
light: UIColor(white: white, alpha: alpha),
dark: UIColor(white: 1 - white, alpha: alpha)
)
}
}
とすることで
let color = UIColor(light: UIColor(white: 0.8, alpha: 1), dark: UIColor(white: 0.2, alpha: 0.1))
と指定していた箇所が
let color = UIColor(dynamicWhite: 0.8, alpha: 1))
となります
HSB
extension UIColor {
convenience init(hue: CGFloat, saturation: CGFloat, dynamicBrightness brightness: CGFloat, alpha: CGFloat) {
self.init(
light: UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha),
dark: UIColor(hue: hue, saturation: saturation, brightness: 1 - brightness, alpha: alpha)
)
}
}
とすることで
let color = UIColor(
light: UIColor(hue: 0, saturation: 0.8, brightness: 0.9, alpha: 1),
dark: UIColor(hue: 0, saturation: 0.8, brightness: 0.1, alpha: 1)
)
と指定していた箇所が
let color = UIColor(hue: 0, saturation: 0.8, dynamicBrightness: 0.9, alpha: 1))
となります
disclaimer
ちゃんと色を定義している場合には使えるケースは限られるかもしれませんが、サクッと確認してみるには便利!