项目中要做白天夜景切换的功能,写了个扩展方便用,记录一下。不太完善,主要是提供一种思路。。。,欢迎大牛指点一下。
先附一个链接
https://github.com/evolFe/DayNightDemo
效果图:
利用category封装 使用是这样的
实现思路:
1,色值变化,主要是view的backgroundcolor,label.texColor, button.titlecolor等等。。。
要是白夜切换肯定要像实现多语言一样 有个key 然后动态绑定到视图上
这里实现是通过一个枚举,这样写代码的时候比价方便
2 图片变换,包括imageView 还有button
key 的话 就是图片本身名字 ,要是夜景的话 图片名字后加_night 例如 mine_bg.png 夜景就是 mine_bg_night.png
然后写一个字符串的 扩展
第二步,Key 解决了以后 接下来就是绑定的问题
创建一个容器类 保存该对象的target 并为对象添加方法和参数, 参数是多参数的。
这里是添加方法参数的实现, 是保存到一个数组里面了, 因为有可能例如button 可能设置了背景色,和title 图片等,多个方法保存
这里是创建容器类的时候 添加通知。。。 并遍历存储的对象方法并执行。。 支持多参数
接下来是category 绑定的问题 使用runtime特性
基本就完事儿了
此处单例使用的比较安全的方式,哈哈哈,因为之前被人问住了,所以尽量标准化写。。。
只是添加了几个简单的功能,项目还在写,用到时候继续补充。。。
续:后来发现项目里使用的时候 定义枚举相当耗时耗力,并且名字不好区分,所以我又改良了一下
使用是这样子的
// z这里
self.view.dnBackGroundColor = ELMakeColorTuple(UIColorFromRGB(0xedeeef), UIColorFromRGB(0x3a3928));
UIImageView * imageView = [[UIImageView alloc] init];
imageView.imageKey = @"mine_bg";
[imageView sizeToFit];
[self.view addSubview:imageView];
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(20, CGRectGetMaxY(imageView.frame), 200, 30)];
label.font = [UIFont systemFontOfSize:15];
label.text = @"这是一个 UILabel";
//这里
label.dnTextColor = ELMakeColorTuple(UIColorFromRGB(0x222222), UIColorFromRGB(0xdcc787));
[self.view addSubview:label];
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
// 这里
button.dnBackGroundColor = ELMakeColorTuple(UIColorFromRGB(0x7c936e), UIColorFromRGB(0x4b4a38));
[button setFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2 - 30, CGRectGetHeight(self.view.frame) - 100, 60, 30)];
[button setTitle:@"Change" forState:UIControlStateNormal];
//这里
[button setDnTitleColor:ELMakeColorTuple([UIColor whiteColor], UIColorFromRGB(0xdcc787)) forState:UIControlStateNormal];
button.titleLabel.font = [UIFont systemFontOfSize:15];
[button addTarget:self action:@selector(dayNightChange:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
使用的时候 dn是day-night的缩写,然后使用方法ELMakeColorTuple创建一个数组@[dayColor, nightColor];
typedef NSArray * ELColorTuple;
ELColorTuple ELMakeColorTuple(UIColor * dayColor, UIColor * nightColor);
需要改变夜景的时候 也无需使用我这单例了,直接调用
@interface ELDayNight : NSObject
/**
公共API 设置白天夜景
@param night 是否是夜景
*/
+ (void)setNight:(BOOL)night;
这个API可以直接调用,[ELDayNight setNight:YES/NO]; //这里没有本地化记录状态,因为我自己的项目里已经实现了。