iOS-简单的皮肤功能

「这是我参与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文件中寻找对应的数据,

如果能找到的话,就把对应的色值赋值给视图色

如果没有找到的话, 就将默认皮肤的色值拿出来赋值

结语

换肤功能还是需要一定逻辑技巧的, 还在摸索中, 如果哪位大神有更好的方法探讨一下, 谢谢

Guess you like

Origin juejin.im/post/7031533413647843342