iOS13的暗黑模式

iOS13引入了暗黑模式(Dark Appearance)。

模擬器設置暗黑模式:在“設置”-“開發者”中打開“Dark Appearance”。

真機設置暗黑模式:在“設置”-“顯示與亮度”中設置外觀爲深色。

在 iOS 13 中,我們可以通過 UITraitCollection 來判斷當前系統的外觀模式。UIView 和 UIViewController 、UIScreen、UIWindow 都已經遵從了UITraitEnvironment這個協議,因此這些類都擁有一個叫做 traitCollection的屬性,在這些類中,我們可以這樣去判斷當前 App 的外觀模式:

BOOL isDark = (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark);

另外,我們還可以通過 UITraitCollection.current這個屬性來獲取當前 App 的外觀模式。但是並不是所有的時候獲取的都是正確的,只有在下面這些方法中,纔可以放心的使用這個屬性:

  • UIView:

draw(), layoutSubview(), traitCollectionDidChange(), tintColorDidChange()

  • UIViewController:

viewWillLayoutSubviews(), viewDidLayoutSubviews(), traitCollectionDidChange()

  • UIPresentationController:

containerViewWillLayoutSubviews(), containerViewDidLayoutSubviews(), traitCollectionDidChange()

如果應用不想適配暗黑模式,可以先暫時全局關閉暗黑模式:
在 Info.plist 文件中,添加 key 爲 User Interface Style,類型爲 String,value 設置爲 Light即可。

在 iOS 13中,UIView、UIViewController 、UIWindow 有了一個 overrideUserInterfaceStyle的新屬性,可以覆蓋系統的外觀模式。

單個頁面或視圖關閉暗黑模式,設置 overrideUserInterfaceStyle 爲對應的模式,強制限制該視圖與其子視圖以設置的模式進行展示,不跟隨系統模式改變進行改變。

self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

如果你希望一個子視圖監聽系統的模式,請將 overrideUserInterfaceStyle 屬性設置爲UIUserInterfaceStyleUnspecified。

typedef NS_ENUM(NSInteger, UIUserInterfaceStyle) {
    UIUserInterfaceStyleUnspecified,
    UIUserInterfaceStyleLight,
    UIUserInterfaceStyleDark,
} API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos);

圖片適配暗黑模式:

在Images.xcassets中點擊圖片,選擇右邊的Image Set,設置Appearances爲“Any,Dark”,即可兼容暗黑模式,可以分別設置暗黑模式和正常模式的圖片。

iOS 13 以下的系統會默認取Any狀態下的設定,iOS 13 會根據系統外觀模式取Any或Dark下的設定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章