項目中加了夜間模式的功能娶聘,現將我的實現方案記錄下:
夜間模式無非是圖片、色值變了截型。那么在賦值的時候我們就要設置兩套圖片和色值趴荸。所有設計稿和切圖都需要兩套。
如何設置兩套圖片
大思路就是使用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:]
方法,不需要夜間模式的地方繼續(xù)使用系統(tǒng)的[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個元素變化卒蘸、狀態(tài)欄改變等等。
個人思路翻默,不一定是最簡單的缸沃,大家有不明白或項目中遇到的問題,可留言談論修械。