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下的設定。