iOS動(dòng)態(tài)換膚-支持暗夜模式

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)\color{red}{UIColor (DynamicColors)},提供了動(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)有切換模式");
    }
}

\color{red}{關(guān)于這種適配方式的幾點(diǎn)看法:}

  • 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])];
}

項(xiàng)目地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問(wèn)答 一、line-height有什么作用? 在CSS,line-height被用來(lái)控制行與行之間的垂直距離。li...
    hk_kh閱讀 194評(píng)論 0 0
  • 不必刻意,不必客套,不必做一切世俗里應(yīng)有的禮儀,甚至可以幾年不見(jiàn),但你就是知道,當(dāng)你需要的時(shí)候,他就在你左右,...
    沁園春_5622閱讀 241評(píng)論 0 0
  • 一:首先如果想要從controller層傳date類(lèi)型為"null"的數(shù)據(jù)到數(shù)據(jù)庫(kù)(前提是對(duì)應(yīng)數(shù)據(jù)庫(kù)時(shí)間字段的是S...
    快樂(lè)的搬磚人閱讀 281評(píng)論 0 0

友情鏈接更多精彩內(nèi)容