iOS 深色模式適配

2023-03-28 18:00:15

要求:iOS13.0以上

重點:需要所有介面進行適配,工作量巨大,需要從專案開始就進行適配;H5介面無法進行適配

 

實現方式:System Colors(常用)Semantic Colors(常用)Dynamic Colors(常用)、Asset Catalog、Border colors、Dynamic Images

 

1.System Colors:

Apple為了適配深色模式對UIKit中的UIColor進行了重新定義,具體顏色程式碼值可檢視apple官方檔案,例如將.red, .blue和 .yellow定義為.systemRed,.systemBlue和.systemYellow,這些新定義的System Colors在深色和淺色模式下表現為不同的顏色。

 

2.Semantic Colors:

對於一些需要進行文字顯示的控制元件apple也做了深色模式的適配,Apple新加了Semantic Colors顏色方案,使用Semantic Colors時不需要糾結具體的值,只需要在合適的場景使用,例如當控制元件是Label時,在沒有自定義字型顏色時,可以使用.label型別的的Semantic Colors,在淺色模式下顯示黑色字型,在深色模式下顯示白色字型;Semantic Colors包括.label,.separator,.link, .systemBackground和.systemFill

 

3.Dynamic Colors(自定義顏色):

在實際開發中很多情況下我們都是需要自定義顏色的,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

        }

    }

}

 

 

4.Asset Catalog:

在asset裡面預先儲存自定義顏色,在Any Appearence(淺色模式)和Dark Appearence(深色模式)分別新增一種顏色即可。一般用於高度重複的顏色,比如主題色等,需要UI高度統一顏色標準。

支援程式碼使用:view.backdroundcolor = Color(named: 「自定義顏色名」)

 

5.Border colors:

Border colors在當主題模式發生改變時並不會自動的進行適配,所以需要手動的進行處理,可以通過traitCollectionDidChange(_:)這個方法在進行處理:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

    super.traitCollectionDidChange(previousTraitCollection)

    traitCollection.hasDifferentColorAppearance(comparedTo: traitCollection) {

        layer.backgroundColor = UIColor.layer.cgColor

    }

}

 

6.Dynamic Images:

圖片資源同樣支援深色模式,需要使用Assets.xcassets,新建一個Assets.xcassets並在Attributes inspector點選Appearances選擇Any, Dark,然後分別為Any Appearances和Dark Appearances設定響應的圖片。

後臺返回圖片時需要自己用程式碼建立Assets。

儘量不要使用圖片,無限的增加圖片資源最終會導致包的大小會增加很多。

可以tintColor或者反轉圖片顏色解決改變圖片顏色問題