在UIImage分类的基础上,再封装一个方法,用来根据当前的皮肤模式,设置不同亮度
需要注意的是,一旦手动设置了亮度,那么程序运行期间,就不再会自动调整亮度
+ (void)setLightnessWithNight:(BOOL)night{
if (night) { // 夜间模式
// 设置屏幕亮度 0.0-1.0 一旦手动设置,就不再回自定调节了(需要真机测试)
[UIScreen mainScreen].brightness = 0.2;
} else {
[UIScreen mainScreen].brightness = 0.8;
}
}
在UIImage分类中,分别在Load方法和saveSkinModeWithNight:方法中调用设置亮度方法,这样程序一起动的时候,会先根据当前皮肤设置对应亮度,切换皮肤保存的同时,同样会设置一次亮度
这个方法并不需要外部调用,所以不需要对外声明,完整代码:
.h
#import <UIKit/UIKit.h>
@interface UIImage (JSSkin)
// 根据皮肤设置图片
+ (UIImage *)jsImageNamed:(NSString *)name;
// 记录皮肤 每次设置皮肤都会调用
+ (void)saveSkinModeWithNight:(BOOL)night;
// 获取皮肤设置
+ (BOOL)isNight;
// 在当前皮肤下,根据颜色的key取出对应的颜色
+ (UIColor *)loadColorWithKey:(NSString *)key;
@end
.m
#import "UIImage+JSSkin.h"
#import <objc/runtime.h>
@implementation UIImage (JSSkin)
// 夜间模式标识(静态全局变量)
static bool isNight;
// 色表的缓存
static NSDictionary *colorCache;
+ (void)load{
// 获取偏好设置中的皮肤模式
isNight = [[NSUserDefaults standardUserDefaults] boolForKey:@"isNight"];
// 使用运行时机制交换方法 一旦交换,在App整个生命周期都会交换
// 1. 获取对应交换的方法
Method method1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
Method method2 = class_getClassMethod([UIImage class], @selector(jsImageNamed:));
// 2. 交换方法
method_exchangeImplementations(method1, method2);
// 加载色表缓存
[self loadColorCache];
// 设置亮度
[self setLightnessWithNight:isNight];
}
+ (UIColor *)loadColorWithKey:(NSString *)key{
// 每个皮肤除了设置不同图片外,通常还需要有一套对应的配色方案,一般使用plist色表来保存方案,色表的命名规范: 控制器_视图_属性
// 从内存中刚取出对应的颜色
return colorCache[key];
}
// 加载色表缓存 硬盘数据-->内存数据
+ (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]];
// 创建可变字典 将字符串字典转换成UIColor字典
NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];
// 遍历字符串字典
[colorDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
// 根据传入的key取出value
// 将得到的value(NSString*)分隔转成一个数组
NSArray *colorArr = [obj componentsSeparatedByString:@","];
CGFloat red = [colorArr[0] floatValue];
CGFloat green = [colorArr[1] floatValue];
CGFloat blue = [colorArr[2] floatValue];
// 设置色表的内存缓存 方便从内存中取出对应的颜色,避免每一次都从沙盒中取出色表(影响性能)
// 内存缓存 选型 字典(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;
}
// 自定义方法,根据当前皮肤设置图片
+ (UIImage *)jsImageNamed:(NSString *)name{
if (isNight) { // 夜间模式
name = [NSString stringWithFormat:@"%@_night",name];
}
return [UIImage jsImageNamed:name];
}
+ (void)saveSkinModeWithNight:(BOOL)night{
// 赋值,记录当前皮肤状态
isNight = night;
// 本地记录状态(偏好设置)
[[NSUserDefaults standardUserDefaults] setBool:isNight forKey:@"isNight"];
[[NSUserDefaults standardUserDefaults] synchronize];
// 加载色表缓存
[self loadColorCache];
// 设置亮度
[self setLightnessWithNight:isNight];
}
+ (void)setLightnessWithNight:(BOOL)night{
if (night) { // 夜间模式
// 设置屏幕亮度 0.0-1.0 一旦手动设置,程序运行期间就不再会自定调节了(需要真机测试)
[UIScreen mainScreen].brightness = 0.2;
} else {
[UIScreen mainScreen].brightness = 0.8;
}
}
+ (BOOL)isNight{
// 返回当前皮肤状态
return isNight;
}
@end