iOS夜間模式實現方案

項目中加了夜間模式的功能,現將我的實現方案記錄下:

夜間模式無非是圖片、色值變了。那么在賦值的時候我們就要設置兩套圖片和色值。所有設計稿和切圖都需要兩套。

如何設置兩套圖片

大思路就是使用NSUserDefault在本地存儲一個標識,切換日間/夜間,比如夜間時我存儲的是"night"字符串。

但是我們不可能在每次設置圖片時都取出此標識,所有需要寫一個UIImage的category。代碼如下:

+ (UIImage *)kg_imageNamed:(NSString *)name {
    NSString *styleStr = [[NSUserDefaults standardUserDefaults] stringForKey:KGSkinStyle];
    if ([styleStr isEqualToString:@"night"]) {
        return [UIImage imageNamed:[name stringByAppendingString:@"N"]];
    }
    return [UIImage imageNamed:name];
}

通過代碼可以看出,夜間模式下取出的圖片是后綴帶‘N’的,所有對圖片命名時有技巧。例如我在Demo中引用的圖片正常模式下命名為mine_picture,夜間模式下需命名為mine_pictureN,后綴加N,后綴自定義,自己高興就好。

這樣,在項目中需要設置夜間模式圖片的地方使用自己的[UIImage kg_imageNamed:]方法,不需要夜間模式的地方繼續使用系統的[UIImage imageNamed:]方法。

如果設置兩套色值

在大思路上圖片和色值是一樣的,不同的是,色值沒有命名技巧可言。
同樣需要寫一個UIColor的category。只設置16進制色值。

+ (UIColor *)kg_colorWithNormalHexColor:(NSInteger)normalHexColor nightHexColor:(NSInteger)nightHexColor {
    NSString *styleStr = [[NSUserDefaults standardUserDefaults] objectForKey:KGSkinStyle];
    if ([styleStr isEqualToString:@"night"]) {
        return [UIColor kg_colorWithHex:nightHexColor];
    }
    return [UIColor kg_colorWithHex:normalHexColor];
}

+ (UIColor *)kg_colorWithHex:(NSInteger)hexColor {
    return [UIColor colorWithRed:((hexColor & 0xFF0000) >> 16)/255.0 green:((hexColor & 0x00FF00) >> 8) /255.0 blue:( hexColor & 0x0000FF)/255.0 alpha:1.0];
}

只要給一個日間模式和夜間模式的色值就可以了。在設置夜間顏色的地方使用[UIColoe kg_colorWithNormalHexColor: nightHexColor:],不需要夜間模式的地方使用[UIColor kg_colorWithHex]

至此,方案就完成了。但在項目中,設置夜間模式還有很多需要注意的地方。比如:如何廣播到全局、各頁面繼承關系、透明遮罩層、導航欄變化、tabbar個元素變化、狀態欄改變等等。

本文Demo地址

個人思路,不一定是最簡單的,大家有不明白或項目中遇到的問題,可留言談論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,809評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 調戲母牛的少年! 老劉涂鴉 不用彩鉛,不用水彩,不用鉛筆,不用草稿,不用上色,純黑色馬克筆涂鴉一幅。 作品標題:調...
    老劉涂鴉閱讀 232評論 0 2
  • 【0902】寫出我心感悟 看到今天的晨讀材料,我心里立馬咯噔一下,我不就是這樣的嗎?絞盡腦汁寫不出來東西來...
    楚冰焰閱讀 257評論 0 0
  • 闐闐給我們又說校慶演出她不演了,說了緣由,是高二的女生學了才4年,就很不把別人放在眼里,自認為很好 ,讓闐闐...
    麗萍在這閱讀 193評論 2 2