iOS暗黑模式適配(Dark Mode)

iOS開發(fā)筆記記錄

暗黑模式簡介不贅述滔蝉,直接寫用法瞳步。

蘋果官方使用鏈接入口

暗黑模式的原理

  1. 其實就是將原本的資源文件闷哆,創(chuàng)建出兩種模式,根據(jù)不同的模式单起,自動獲取該樣式的資源抱怔。
  2. 每次切換系統(tǒng)模式的時候,系統(tǒng)會重新調(diào)用一些方法嘀倒,重新賦值屈留。

適配工作

對于開發(fā)者來說,適配暗黑模式测蘑,需要做的工作是:

  1. 顏色適配(文字顏色灌危,背景顏色)
  2. 圖片適配
  3. 狀態(tài)欄適配
  4. 模式切換代理
  5. 關(guān)閉暗黑模式(或者關(guān)閉某一個頁面的暗黑模式)
  6. 其他

1. 顏色適配

iOS13之前UIColor只能代表一種顏色,但是在iOS13之后,系統(tǒng)提供了一些UIColor的顏色是動態(tài)的碳胳,可以在Light ModeDark Mode下顯示不同的顏色勇蝙。在這里不多講,因為真是開發(fā)中挨约,文字顏色或者背景顏色都是UI設計好的味混,不太可能會用到系統(tǒng)的。

iOS13蘋果提供了兩個專用的方法:

+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);

一個是類方法诫惭,一個是對象方法
這兩個方法需要傳入一個Block,當系統(tǒng)切換模式的時候翁锡,會觸發(fā)回調(diào)。
這個block會返回一個UITraitCollection類的對象夕土,通過其屬性userInterfaceStyle馆衔,可以得到當前是LightMode還是DarkMode
具體的用法如下:

UIColor *bgColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
        if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
            return [UIColor redColor];
        }
        else {
            return [UIColor greenColor];
        }
    }];
    
 self.view.backgroundColor =  bgColor;

我們在開發(fā)的時候可以將此方法封裝一下隘弊,方便使用哈踱。

2. 圖片適配

在Xcode的Assets.xcassets里面
添加一個icon的時候荒适,默認是這個樣子的

圖片1

右邊有一個Appearances的選項是這樣的:
默認Appearances

默認選擇的是None
點開之后有其他選項梨熙,我們選擇支持暗黑模式。并加入另外一組資源后:
支持暗黑模式的圖片資源

這個時候我們發(fā)現(xiàn)刀诬,下面多了一組Dark Appearances
這就是暗黑模式下的圖片資源咽扇。
當我們切換系統(tǒng)模式的時候邪财,系統(tǒng)會獲取其對應的圖片。
使用方法和原來的一樣质欲,例如:

[backBtn setImage:[UIImage imageNamed:@"nav_back_white"] forState:UIControlStateNormal];
self.backImgView.image = [UIImage imageNamed:@"nav_back_white"];

3.狀態(tài)欄適配

狀態(tài)欄需要根據(jù)模式代理進行切換即可树埠,不贅述。
代理用法??????????

4. 模式切換代理

有的時候嘶伟,頁面復雜怎憋,需要根據(jù)不同的模式執(zhí)行不同的操作
系統(tǒng)為我們提供了代理方法,當系統(tǒng)切換模式的時候九昧,會回調(diào)這個方法绊袋。將我們做的操作寫在這里即可:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
        
        if (@available(iOS 13.0, *)) {
            if ([UITraitCollection currentTraitCollection].userInterfaceStyle == UIUserInterfaceStyleDark) {
                [self.editBtn setImage:[UIImage imageNamed:@"navigation_bar_userInfo_editor_white"] forState:UIControlStateNormal];
                [self.moreBtn setImage:[UIImage imageNamed:@"nav_more_icon_w"] forState:UIControlStateNormal];
            } else {
                [self.editBtn setImage:[UIImage imageNamed:@"navigation_bar_userInfo_editor_black"] forState:UIControlStateNormal];
                [self.moreBtn setImage:[UIImage imageNamed:@"nav_more_icon_d"] forState:UIControlStateNormal];
            }
        } else {
            [self.editBtn setImage:[UIImage imageNamed:@"navigation_bar_userInfo_editor_black"] forState:UIControlStateNormal];
            [self.moreBtn setImage:[UIImage imageNamed:@"nav_more_icon_d"] forState:UIControlStateNormal];
        }
    }
}

5. 關(guān)閉暗黑模式(或者關(guān)閉某一個頁面的暗黑模式)

5.1關(guān)閉某一個頁面的暗黑模式

某些頁面由于設計需要,無需進行適配铸鹰,或者只要顯示固定的一個模式癌别。
那怎么做呢?

  • UIViewController與UIView 都新增一個屬性 overrideUserInterfaceStyle
  • 關(guān)于window有一個特殊情況蹋笼,我們下面在6其他里面具體說展姐。

將overrideUserInterfaceStyle設置為對應的模式即可:

if (@available(iOS 13.0, *)) {
       self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
 } else {
       // Fallback on earlier versions
 }
5.2全局暗黑模式
  1. 在Info.plist 文件中,添加UIUserInterfaceStyle key 名字為 User Interface Style 值為String剖毯,

  2. 將UIUserInterfaceStyle key 的值設置為 Light

6.其他:

  1. 設置 Window 的該屬性圾笨, 將會影響窗口中的所有內(nèi)容都采用樣式,包括根視圖控制器和在該窗口中顯示內(nèi)容的所有演示控制器(UIPresentationController)

所以速兔,這里就有一個常用的功能:選擇是否跟隨系統(tǒng)墅拭。

如圖:


選擇是否跟隨系統(tǒng)

點擊選擇模式:


選擇模式

當要實現(xiàn)這個功能的時候,就可以用到window涣狗。


if (index== 0){
     [UIApplication sharedApplication].keyWindow.overrideUserInterfaceStyle = UIUserInterfaceStyleUnspecified;
 }else if (index == 1) {
     [UIApplication sharedApplication].keyWindow.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
 }else if (index == 2) {
     [UIApplication sharedApplication].keyWindow.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍婉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镀钓,更是在濱河造成了極大的恐慌穗熬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丁溅,死亡現(xiàn)場離奇詭異唤蔗,居然都是意外死亡,警方通過查閱死者的電腦和手機窟赏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門妓柜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涯穷,你說我怎么就攤上這事棍掐。” “怎么了拷况?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵作煌,是天一觀的道長掘殴。 經(jīng)常有香客問我,道長粟誓,這世上最難降的妖魔是什么奏寨? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鹰服,結(jié)果婚禮上病瞳,老公的妹妹穿的比我還像新娘。我一直安慰自己悲酷,他們只是感情好仍源,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舔涎,像睡著了一般笼踩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亡嫌,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天嚎于,我揣著相機與錄音,去河邊找鬼挟冠。 笑死于购,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的知染。 我是一名探鬼主播肋僧,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼控淡!你這毒婦竟也來了嫌吠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掺炭,失蹤者是張志新(化名)和其女友劉穎辫诅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涧狮,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡炕矮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了者冤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肤视。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涉枫,靈堂內(nèi)的尸體忽然破棺而出邢滑,到底是詐尸還是另有隱情,我是刑警寧澤拜银,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布殊鞭,位于F島的核電站,受9級特大地震影響尼桶,放射性物質(zhì)發(fā)生泄漏操灿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一泵督、第九天 我趴在偏房一處隱蔽的房頂上張望趾盐。 院中可真熱鬧,春花似錦小腊、人聲如沸救鲤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本缠。三九已至,卻和暖如春入问,著一層夾襖步出監(jiān)牢的瞬間丹锹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工芬失, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楣黍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓棱烂,卻偏偏與公主長得像租漂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颊糜,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345