在UIImage分類的基礎(chǔ)上,再封裝一個方法,用來根據(jù)當(dāng)前的皮膚模式,設(shè)置不同亮度
需要注意的是,一旦手動設(shè)置了亮度,那么程序運(yùn)行期間,就不再會自動調(diào)整亮度
+ (void)setLightnessWithNight:(BOOL)night{
if (night) { // 夜間模式
// 設(shè)置屏幕亮度 0.0-1.0 一旦手動設(shè)置,就不再回自定調(diào)節(jié)了(需要真機(jī)測試)
[UIScreen mainScreen].brightness = 0.2;
} else {
[UIScreen mainScreen].brightness = 0.8;
}
}
在UIImage分類中,分別在Load方法和saveSkinModeWithNight:方法中調(diào)用設(shè)置亮度方法,這樣程序一起動的時候,會先根據(jù)當(dāng)前皮膚設(shè)置對應(yīng)亮度,切換皮膚保存的同時,同樣會設(shè)置一次亮度
這個方法并不需要外部調(diào)用,所以不需要對外聲明,完整代碼:
.h
#import <UIKit/UIKit.h>
@interface UIImage (JSSkin)
// 根據(jù)皮膚設(shè)置圖片
+ (UIImage *)jsImageNamed:(NSString *)name;
// 記錄皮膚 每次設(shè)置皮膚都會調(diào)用
+ (void)saveSkinModeWithNight:(BOOL)night;
// 獲取皮膚設(shè)置
+ (BOOL)isNight;
// 在當(dāng)前皮膚下,根據(jù)顏色的key取出對應(yīng)的顏色
+ (UIColor *)loadColorWithKey:(NSString *)key;
@end
.m
#import "UIImage+JSSkin.h"
#import <objc/runtime.h>
@implementation UIImage (JSSkin)
// 夜間模式標(biāo)識(靜態(tài)全局變量)
static bool isNight;
// 色表的緩存
static NSDictionary *colorCache;
+ (void)load{
// 獲取偏好設(shè)置中的皮膚模式
isNight = [[NSUserDefaults standardUserDefaults] boolForKey:@"isNight"];
// 使用運(yùn)行時機(jī)制交換方法 一旦交換,在App整個生命周期都會交換
// 1. 獲取對應(yīng)交換的方法
Method method1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
Method method2 = class_getClassMethod([UIImage class], @selector(jsImageNamed:));
// 2. 交換方法
method_exchangeImplementations(method1, method2);
// 加載色表緩存
[self loadColorCache];
// 設(shè)置亮度
[self setLightnessWithNight:isNight];
}
+ (UIColor *)loadColorWithKey:(NSString *)key{
// 每個皮膚除了設(shè)置不同圖片外,通常還需要有一套對應(yīng)的配色方案,一般使用plist色表來保存方案,色表的命名規(guī)范: 控制器_視圖_屬性
// 從內(nèi)存中剛?cè)〕鰧?yīng)的顏色
return colorCache[key];
}
// 加載色表緩存 硬盤數(shù)據(jù)-->內(nèi)存數(shù)據(jù)
+ (void)loadColorCache{
// 從plist中取出色表
NSString *path = @"";
if (isNight) {
path = @"skin/night/color.plist";
}else {
path = @"skin/default/color.plist";
}
NSDictionary *colorDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:path ofType:nil]];
// 創(chuàng)建可變字典 將字符串字典轉(zhuǎn)換成UIColor字典
NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
// 遍歷字符串字典
[colorDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
// 根據(jù)傳入的key取出value
// 將得到的value(NSString*)分隔轉(zhuǎn)成一個數(shù)組
NSArray *colorArr = [obj componentsSeparatedByString:@","];
CGFloat red = [colorArr[0] floatValue];
CGFloat green = [colorArr[1] floatValue];
CGFloat blue = [colorArr[2] floatValue];
// 設(shè)置色表的內(nèi)存緩存 方便從內(nèi)存中取出對應(yīng)的顏色,避免每一次都從沙盒中取出色表(影響性能)
// 內(nèi)存緩存 選型 字典(key:plist中的key value:色值NSString) -> 字典(key:不變 value:UIColor)
UIColor *color = [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:1.0];
// 存到臨時可變字典中
[tempDict setObject:color forKey:key];
}];
// 存到緩存
colorCache = tempDict.copy;
}
// 自定義方法,根據(jù)當(dāng)前皮膚設(shè)置圖片
+ (UIImage *)jsImageNamed:(NSString *)name{
if (isNight) { // 夜間模式
name = [NSString stringWithFormat:@"%@_night",name];
}
return [UIImage jsImageNamed:name];
}
+ (void)saveSkinModeWithNight:(BOOL)night{
// 賦值,記錄當(dāng)前皮膚狀態(tài)
isNight = night;
// 本地記錄狀態(tài)(偏好設(shè)置)
[[NSUserDefaults standardUserDefaults] setBool:isNight forKey:@"isNight"];
[[NSUserDefaults standardUserDefaults] synchronize];
// 加載色表緩存
[self loadColorCache];
// 設(shè)置亮度
[self setLightnessWithNight:isNight];
}
+ (void)setLightnessWithNight:(BOOL)night{
if (night) { // 夜間模式
// 設(shè)置屏幕亮度 0.0-1.0 一旦手動設(shè)置,程序運(yùn)行期間就不再會自定調(diào)節(jié)了(需要真機(jī)測試)
[UIScreen mainScreen].brightness = 0.2;
} else {
[UIScreen mainScreen].brightness = 0.8;
}
}
+ (BOOL)isNight{
// 返回當(dāng)前皮膚狀態(tài)
return isNight;
}
@end