iOS 极其简单的夜间模式实现方案 附开源库
程序员文章站
2022-05-15 08:36:54
...
前言
开发过程中也许会遇到需要切换不同色系皮肤模式的需求,例如夜间模式切换,股票红涨绿跌的切换等。
单纯的从技术角度讲,这个功能实现起来并没有技术难点,最基本的做法是切换模式的时候抛个通知,VC或View收到通知后更改颜色图片等。虽然技术不难,但是实现难度相对较大,毕竟很琐碎,而且平白增加了很多控制代码,严重影响代码的可读和可维护性。
带着把对系统的影响降到最低的目标,我们想到了利用 Runtime来解决这个难题。毕竟任何想把对系统影响降到最低的边缘需求,我们都应该优先考虑是否可以利用Runtime来处理。
关于本问题的Runtime处理思路
1、 利用Runtime给基类NSObject添加属性用于保存设置的颜色以及图片等内容,并在合适的时机注册及移除监听。
2、当接收到颜色模式变更的通知后,根据最新的模式选项变更自身的颜色,图片等。
3、因为不同的UI控件有不同的颜色图片属性,所以应根据需要针对有差异的控件进行单独处理。有类似需求的统一处理,以便于尽可能的减少冗余代码的产生。
组件实现
/** 以下内容依据pod库整理 */
//管理类
IXColorMgr
//颜色设置相关【提供颜色选择器】
IXColor
//图片设置相关【提供图片选择器】
IXImage
//基类分类【提供最基本的颜色&图片存储,注册&注销监听,以及最基本的property更新】
NSObject+Color
//提供dealloc方法的回调通知【因为分类里无法重写dealloc方法,即便写了也无法生效】
IXDeallocBlockExecutor
//UIKit组件【提供最基本的UI控件的处理】
UIKit/**
//Quartz组件【提供最基本的CALayer极其部分子类的处理】
Quartz/**
组件使用
导入工程
1、使用cocoapod,在podfile文件中添加 pod ‘IXColor’,执行pod update即可。
2、不使用pod,访问网址:https://github.com/NSSONGMENG/IXColor下载demo,将IXColor文件夹拖入工程即可。
第二种方式便于自己动手修改
具体使用
//导入头文件
#import "IXColorHeader.h"
//设置App所支持的相关模式
[IXColorMgr defaultMgr].versions = @[@"white",@"black"];
//当前所选模式
[IXColorMgr defaultMgr].curVersion = @"white";
//针对不同的模式设置控件颜色和图片
eg.
//UILabel
label.textColorPicker = IXColorPickerWithRGB(0x1d1d1d,0xe2e2e2);
//UISwitch
switch.onTintColorPicker = IXColorPickerWithRGB(0xffe400,0xffac32);
switch.tintColorPicker = IXColorPickerWithRGB(0xe64a4a,0x28ac8e);
//UIView
view.backgroundColorPicker = IXColorPickerWithRGB(0xe2e2e2,0x1d1d1d);
//UINavigationBar
navigationBar.barTintColorPicker = IXColorPickerWithRGB(0xe2e2e2,0x1d1d1d);
//UIImageView
UIImage * img1 = [UIImage imageNamed:@"m_c_usd"];
UIImage * img2 = [UIImage imageNamed:@"m_c_usd_sl"];
imageView.imagePicker = IXImagePickerWithImages(img1,img2);
由于控件太多,此处就不一一介绍了。
Demo地址: https://github.com/NSSONGMENG/IXColor