一.? 為什么要適配暗黑模式
1、可以幫助我們節(jié)省更多的電量纵诞。
這得益于 OLED 屏幕的發(fā)展忙干,與 LCD 不同 器予, OLED 能夠自發(fā)光,每個像素點都能發(fā)出紅綠藍三色光捐迫,而 LCD 則通過其背光層穿透有顏色的薄膜來發(fā)出不同的光乾翔。這樣在暗黑模式下,OLED 就具有天生的優(yōu)勢施戴,只需要關閉黑色區(qū)域的顯示反浓,就可以達到純黑效果,而 LCD 的背光層只能發(fā)射白光赞哗,所以在顯示黑色的時候雷则,仍然會有部分光透過顏色薄膜,無法達到純黑效果肪笋,只能達到相對黑的效果. 所以月劈,在如今使用 OLED 屏幕的手機上面度迂,開啟暗黑模式會大幅減少手機電量的消耗
2、為弱視以及對強光敏感的用戶提高可視性
3猜揪、讓所有人都可以在光線較暗的環(huán)境中更輕松地使用設備惭墓,保護視力
二.? 適配暗黑模式所需工作
? 1、適配 背景顏色而姐、文字顏色(需要UI提供顏色值)
? 2腊凶、替換圖標、圖片(需要UI配合切圖)
? 3拴念、在應用內為用戶提供切換主題的開關選項(可選)
三.? 圖標適配方法? (暫推薦 1種通用方法钧萍,需UI配合切圖)
1、在 Images.xcassets 中配置不同模式下的圖片
四.? 顏色值適配方法 (三種方法丈莺,推薦方法2 或 3)
1划煮、宏定義顏色值
// 暗黑模式 YES是
#define CKDarkMode @available(iOS 13.0, *) && UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark
// MARK: - 十六進制顏色
#define HexOf(rgbValue) Hex_A(rgbValue,1.0)
#define Hex_A(rgbValue,a) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:a]
// MARK: - 用全局變量設置背景、文字,可以優(yōu)雅的主題切換 (取全局唯一性的名稱,便于維護;最前面的優(yōu)先級最高)
#define Color_Bg ? ? ? CKDarkMode?HexOf(0x191C32):HexOf(0xf4f4f4)?//背景主題顏色 ? 黑色/白色
#define Color_ContView CKDarkMode?HexOf(0x1D213B):HexOf(0xffffff)?//內容缔俄、cell顏色 深藍色/白色 如果背景和cell顏色一樣,就都用這個
2、UIColor的拓展
+(UIColor *)ContViewColor{
? if (@available(iOS 13.0, *)) {
? ? ? UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
? ? ? ? ? if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
? ? ? ? ? ? ? return ColorA;
? ? ? ? ? }else {
? ? ? ? ? ? ? return ColorB;
? ? ? ? ? }
? ? ? }];
? ? ? return dyColor;
? }else{
? ? ? return ColorB;
? }
}
3器躏、在 Images.xcassets 中定義常用顏色俐载,跟使用圖片一樣噠
1.Dark模式變化后可以 界面顏色值會自動變化
2.在 Images.xcassets 中設置顏色和圖片是向下兼容的,iOS 13 以下的系統(tǒng)會默認取`Any`狀態(tài)下的設定登失,iOS 13 會根據(jù)系統(tǒng)模式取`Any`或`Dark`下的設定遏佣。
? ? ?
五.? UITraitCollection介紹
1、在 iOS 13 中揽浙,我們可以通過 UITraitCollection 來判斷當前系統(tǒng)的模式状婶。
2、另外馅巷,我們還可以通過 UITraitCollection.current這個屬性來獲取當前 App 的顏色模式膛虫。
3、在 iOS 13中钓猬,UIView稍刀、UIViewController 、UIWindow 有了一個 overrideUserInterfaceStyle的新屬性敞曹,可以覆蓋系統(tǒng)的模式账月。
六. 注意事項
1、 Status Bar 的 style
typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
? UIStatusBarStyleDefault ? ? = 0, // Automatically chooses light or dark content based on the user interface style
? UIStatusBarStyleLightContent = 1, // Light content, for use on dark backgrounds
? UIStatusBarStyleDarkContent = 3, // Dark content, for use on light backgrounds
};
2.全局關閉暗黑模式 (偷懶要看產(chǎn)品&UI是否同意澳迫,哈哈局齿,可能過段時間蘋果就取消這種方式了 )
a.在Info.plist 文件中,添加UIUserInterfaceStyle?key 名字為?User Interface Style?值為String橄登,
b.將UIUserInterfaceStyle?key 的值設置為?Light