「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
前言
在APP迭代中, 业务方肯定会有各种各样奇葩需求, 我们当前的业务是做电商, 非非非非常多的起码需求, 由于APP发版需要平台审核, 所以就想把一些页面改成web样式的, 由于把一些页面改成web样式导致和整体APP色调不搭, 就想出来一个 换色换肤的功能. 折磨够呛...
虽然他们有各种各样的需求, 同样的也锻炼了我们编程和业务结合的能力, 对自己以后编码的宽度还是有一定的提升的
今天咱们就来说一说这个坑爹的换肤功能.
换肤
既然是换肤, 简单来说就是要更换APP中的图片以及色值.
而色值和图片展示都是使用了系统的UI控件.
那么我们再控件中直接监听这个更换的消息, 来达到换肤的效果.
增加属性
简单来说就是给系统的空间增加一个属性, 我们在属性的set方法中来进行操作.
比如: UIView
我们给这个控件来增加一些属性,来达到我们的目的, 我这里说一下我的操作
@interface UIView (ThemeEx)
@property (nonatomic, copy) NSString *themeBgColor;
@property (nonatomic, copy) NSString *themeTintColor;
@end
复制代码
我们设置了两个属性, 需要用runtime的但方式将这个属性给到实例,
其他的空间也如此差不多
使用
首先我们准备一个json文件, 内部记录这皮肤下的色值以及图片路径, 比如:
{
"colors":{
"backgroundColorKey":"#E92424",
"gradientStockUp":[
"#0FFFFFFF",
"#0FE92424"
]
},
"images": {
"info_icon": "skin/skinImage/light/info_icon.png",
"money_icon": "skin/skinImage/light/money_icon.png",
}
}
复制代码
skin/skinImage/light/money_icon.png
就是对应的图片所在的文件路径
在代码中如何使用呢?
首先我们将json解析出来, 存到我们的字典中. 然后在代码使用的过程中是这样的:
UIView *view = UIView.new;
view.themeBgColor = backgroundColorKey;
复制代码
这里的backgroundColorKey
就是为了方便编码, 使用全局静态变量保存的一个同名字符串theme://backgroundColorKey
调用逻辑
首先判断themeBgColor
传入的数据是否是 #
号开头的, 如果是的话那么就是色值的值, 调用16进制色值方法.
再次判断传入的数据 是否是 theme://
开头, 如果是的话, 那么就在对应色值的json文件中寻找对应的数据,
如果能找到的话,就把对应的色值赋值给视图色
如果没有找到的话, 就将默认皮肤的色值拿出来赋值
结语
换肤功能还是需要一定逻辑技巧的, 还在摸索中, 如果哪位大神有更好的方法探讨一下, 谢谢