iOS13から採用されたダークモードに対応するためにやった事など・・・
ダークモード時はアプリの背景色とかを黒っぽくしたりするやつです。
アプリを起動したあとに設定アプリで外観モード(ダーク or ライト)を変更した時にも色が切り替わるようにするにはダイナミックカラーを利用する必要があります。
以下のように、UIColorを拡張して別ファイルにしておくとプロジェクトに追加するだけで使えるので便利です。
カラーを16進数(hex)とrgbで指定できるようにもしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
extension UIColor { // ダークモード対応のためダイナミックカラーを返す private class func dynamicColor(light: UIColor, dark: UIColor) -> UIColor { if #available(iOS 13, *) { return UIColor { (traitCollection) -> UIColor in if traitCollection.userInterfaceStyle == .dark { return dark } else { return light } } } return light } // カラーを定義する public static var viewBackground: UIColor { return dynamicColor( light: UIColor.hex("#ffffff", alpha: 1), //dark: UIColor.hex("#000000", alpha: 1) dark: UIColor.rgb(r: 0, g: 0, b: 0, alpha: 1.0) ) } // 16進数で色を指定出来るように private class func hex (_ hexStr : String, alpha : CGFloat) -> UIColor { var hexStr = hexStr hexStr = hexStr.replacingOccurrences(of: "#", with: "") if hexStr.count == 3 { var newHexStr = "" for c in hexStr { newHexStr += "\(c)\(c)" } hexStr = newHexStr } let scanner = Scanner(string: hexStr as String) var color: UInt64 = 0 if scanner.scanHexInt64(&color) { let r = CGFloat((color & 0xFF0000) >> 16) / 255.0 let g = CGFloat((color & 0x00FF00) >> 8) / 255.0 let b = CGFloat(color & 0x0000FF) / 255.0 return UIColor(red:r,green:g,blue:b,alpha:alpha) } else { return UIColor.white } } // RGBで色を指定出来るように private class func rgb(r: Int, g: Int, b: Int, alpha: CGFloat) -> UIColor{ return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: alpha) } } //extension UIColor // ダークモード判定 extension UITraitCollection { public static var isDarkMode: Bool { if #available(iOS 13, *), current.userInterfaceStyle == .dark { return true } return false } } |
これで上で定義したカラー(viewBackground)を
view.backgroundColor = UIColor.viewBackground のように使用します。
GitHubにプロジェクトを公開しています
https://github.com/tn-works-jp/dynamicColor
開発環境:
iMac (Retina 5K, 27-inch, Late 2015)
macOS Catalina Version 10.15.5
Xcode Version 11.5 (11E608c)