iOS開發(fā)筆記記錄
暗黑模式簡介不贅述滔蝉,直接寫用法瞳步。
暗黑模式的原理
- 其實就是將原本的資源文件闷哆,創(chuàng)建出兩種模式,根據(jù)不同的模式单起,自動獲取該樣式的資源抱怔。
- 每次切換系統(tǒng)模式的時候,系統(tǒng)會重新調(diào)用一些方法嘀倒,重新賦值屈留。
適配工作
對于開發(fā)者來說,適配暗黑模式测蘑,需要做的工作是:
- 顏色適配(文字顏色灌危,背景顏色)
- 圖片適配
- 狀態(tài)欄適配
- 模式切換代理
- 關(guān)閉暗黑模式(或者關(guān)閉某一個頁面的暗黑模式)
- 其他
1. 顏色適配
iOS13之前UIColor
只能代表一種顏色,但是在iOS13之后,系統(tǒng)提供了一些UIColor
的顏色是動態(tài)的碳胳,可以在Light Mode
和Dark 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的時候荒适,默認是這個樣子的
右邊有一個
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全局暗黑模式
在Info.plist 文件中,添加UIUserInterfaceStyle key 名字為 User Interface Style 值為String剖毯,
將UIUserInterfaceStyle key 的值設置為 Light
6.其他:
- 設置 Window 的該屬性圾笨, 將會影響窗口中的所有內(nèi)容都采用樣式,包括根視圖控制器和在該窗口中顯示內(nèi)容的所有演示控制器(UIPresentationController)
所以速兔,這里就有一個常用的功能:選擇是否跟隨系統(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;
}