要求:iOS13.0以上
重點:需要所有介面進行適配,工作量巨大,需要從專案開始就進行適配;H5介面無法進行適配
實現方式:System Colors(常用)、Semantic Colors(常用)、Dynamic Colors(常用)、Asset Catalog、Border colors、Dynamic Images
Apple為了適配深色模式對UIKit中的UIColor進行了重新定義,具體顏色程式碼值可檢視apple官方檔案,例如將.red, .blue和 .yellow定義為.systemRed,.systemBlue和.systemYellow,這些新定義的System Colors在深色和淺色模式下表現為不同的顏色。
對於一些需要進行文字顯示的控制元件apple也做了深色模式的適配,Apple新加了Semantic Colors顏色方案,使用Semantic Colors時不需要糾結具體的值,只需要在合適的場景使用,例如當控制元件是Label時,在沒有自定義字型顏色時,可以使用.label型別的的Semantic Colors,在淺色模式下顯示黑色字型,在深色模式下顯示白色字型;Semantic Colors包括.label,.separator,.link, .systemBackground和.systemFill。
在實際開發中很多情況下我們都是需要自定義顏色的,Apple也給出了相應的方案,那就是通過UIColor.init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)這個方法進行建立自定義的semantic color。
為系統類UIColor寫一個擴充套件
public extension UIColor { static func | (lightMode: UIColor, darkMode: UIColor) -> UIColor { guard #available(iOS 13.0, *) else { return lightMode } return UIColor { (traitCollection) -> UIColor in return traitCollection.userInterfaceStyle == .light ? lightMode : darkMode } } }
在asset裡面預先儲存自定義顏色,在Any Appearence(淺色模式)和Dark Appearence(深色模式)分別新增一種顏色即可。一般用於高度重複的顏色,比如主題色等,需要UI高度統一顏色標準。
支援程式碼使用:view.backdroundcolor = Color(named: 「自定義顏色名」)
Border colors在當主題模式發生改變時並不會自動的進行適配,所以需要手動的進行處理,可以通過traitCollectionDidChange(_:)這個方法在進行處理:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
traitCollection.hasDifferentColorAppearance(comparedTo: traitCollection) {
layer.backgroundColor = UIColor.layer.cgColor
}
}
圖片資源同樣支援深色模式,需要使用Assets.xcassets,新建一個Assets.xcassets並在Attributes inspector點選Appearances選擇Any, Dark,然後分別為Any Appearances和Dark Appearances設定響應的圖片。
後臺返回圖片時需要自己用程式碼建立Assets。
儘量不要使用圖片,無限的增加圖片資源最終會導致包的大小會增加很多。
可以tintColor或者反轉圖片顏色解決改變圖片顏色問題