
QQ20200324-230722-HD.gif
適配暗夜模式
????????iOS13新出現(xiàn)了暗夜模式,蘋(píng)果新增了一些API方便我們來(lái)做適配。這里不做深入,只是稍微總結(jié)下。
????????適配暗夜模式,無(wú)非就是界面顯示上的一些變化,暗夜模式下,主題由默認(rèn)的白色調(diào)變?yōu)榱松钌{(diào),相應(yīng)的,我們的APP在顯示上也需要做相應(yīng)調(diào)整。主要包括兩個(gè)方面:顏色的變化(視圖顏色色,字體顏色等)和圖片的改變;
-
關(guān)于顏色改變:UIcolor新增了一個(gè)分類(lèi)
,提供了動(dòng)態(tài)color的API。通過(guò)特征收集器traitCollection,可以動(dòng)態(tài)判斷當(dāng)前手機(jī)的一些界面特征信息。
/*使用時(shí)可以做下進(jìn)一步封裝。*/
[UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
UIColor *color = [UIColor lightGrayColor];
if (@available(iOS 13.0,*)) {
if (traitCollection.userInterfaceStyle ==UIUserInterfaceStyleDark ) {
color =[UIColor blackColor];//dark
}else if(traitCollection.userInterfaceStyle ==UIUserInterfaceStyleLight){
color =[UIColor lightGrayColor];//light
}
}
return color;
}];
-
關(guān)于圖片:可以在Assets.xcassets中給每一套圖片設(shè)置對(duì)應(yīng)的模式,系統(tǒng)自動(dòng)根據(jù)當(dāng)前的模式取用相應(yīng)的圖片;
C3BBD796-0638-4CD6-ACD1-4C3C0F9A63D3.png - 監(jiān)聽(tīng)模式的改變:做好以上兩點(diǎn)只能部分滿足需求,很多時(shí)候我們需要確切的知道當(dāng)前的模式,并且知道用戶什么時(shí)候切換的模式;
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
[super traitCollectionDidChange:previousTraitCollection];
if ([UITraitCollection currentTraitCollection].userInterfaceStyle !=previousTraitCollection.userInterfaceStyle ) {
NSLog(@"用戶切換了模式,在這里做適配工作");
}else{
NSLog(@"用戶沒(méi)有切換模式");
}
}
- 1.工作繁瑣,代碼雜亂。界面如果需要做一些定制化的改變,就需要監(jiān)聽(tīng)模式的改變,可能出現(xiàn)一個(gè)界面適配的代碼出現(xiàn)在好幾個(gè)地方。
- 2.擴(kuò)展性不高。現(xiàn)在出現(xiàn)了一個(gè)暗夜模式,將來(lái)會(huì)不會(huì)再有其他模式?如果APP本來(lái)就有幾套主題,那么適配起來(lái)更加繁瑣雜亂。
- 3.細(xì)細(xì)想來(lái),適配暗夜模式,不就是切換主題嗎,單獨(dú)給暗夜模式弄一套對(duì)應(yīng)皮膚就完了。下面看看,如何給APP便捷高效、擴(kuò)展性性高地?fù)Q膚。
動(dòng)態(tài)換膚(DynamicSkin)
代碼簡(jiǎn)潔,便于維護(hù);
自動(dòng)適配暗夜模式,不需要自己每個(gè)界面去監(jiān)聽(tīng)模式的切換;
使用步驟
-
1.引入框架,導(dǎo)入頭文件
手動(dòng)引入或者通過(guò)CocoaPods
pod 'DynamicSkin'
#import "DPDynamicTheme.h"
-
2.配置模型
繼承DPThemeConfig,根據(jù)自己的需求,配置相應(yīng)字段即可。
#import "DPThemeConfig.h"
NS_ASSUME_NONNULL_BEGIN
@interface TestConfig : DPThemeConfig
@property(nonatomic,copy)NSString*color1;
@property(nonatomic,copy)NSString*color2;
@property(nonatomic,copy)NSString*img1;
@property(nonatomic,copy)NSString*tabOne;
@property(nonatomic,copy)NSString*tabTwo;
@property(nonatomic,copy)NSString*tabThree;
@property(nonatomic,copy)NSString*tabTextColorNormal;
@property(nonatomic,copy)NSString*tabTextColorSelect;
@property(nonatomic,copy)NSString*state;
@end
NS_ASSUME_NONNULL_END
- 3.設(shè)置默認(rèn)主題
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *dataSource = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"theme" ofType:@"plist"]];
TestConfig *one = [TestConfig mj_objectWithKeyValues: [dataSource objectForKey:@"one"]];
[[DPThemeManager manager]pushCurrentThemme:one];
//這里需要主動(dòng)設(shè)置一套暗夜模式的主題,用戶切換時(shí)自動(dòng)替換。如果不設(shè)置,需要自己監(jiān)聽(tīng)暗夜模式是否開(kāi)啟,開(kāi)啟時(shí)主動(dòng)切換到暗夜模式皮膚。
TestConfig *dark = [TestConfig mj_objectWithKeyValues: [dataSource objectForKey:@"dark"]];
[[DPThemeManager manager]pushDarkModeTheme:dark];
return YES;
}
- 4.數(shù)據(jù)綁定
__weak typeof (self)weakSelf = self;
//用戶切換暗夜模式,或則主動(dòng)切換pushCurrentThemme:,會(huì)觸發(fā)該回調(diào)
[self tz_dynamicTheme:^(TestConfig * _Nullable config) {
[weakSelf.image sd_setImageWithURL:[NSURL URLWithString:config.img1]];
weakSelf.statelabel.text = config.state;
} WithIdentifier:NSStringFromClass([self class])];
}
- 5.銷(xiāo)毀不需要的回調(diào)
-(void)dealloc{
//identifer需要和當(dāng)前界面綁定的保持一致
[[DPThemeManager manager] removeUpdateWithIdentifer:NSStringFromClass([self class])];
}
