/ iOS

如何优雅的适配多主题样式

前言

对于日间夜间模式切换 , 多种色调主题切换 , 这类的需求可以说在阅读社交类APP中屡见不鲜了 , 但如何能更方便的实现这一需求呢? 不要说给每个自定义的view神马的加个通知 然后在通知事件里设置各种属性的颜色图片等等 , NO , 那不是一个好的Coder该做的事 , 我们应该追求用最简单的方式去完成最繁琐的事 , 正是出于这些原因 , 我开发了这个主题管理库 今天开源出来分享给大家 ----- LEETheme

LEETheme

什么是LEETheme ? 它是一个轻量级主题管理开源库 , 完美的适配系统版本差异 , 拥有良好的兼容性 , 任何对象都可以支持 , 优雅的使用方式 , 相比传统多主题处理方式而言 , LEETheme 只需一句代码 即可完成对象多样式的操作.


效果演示

朋友圈Demo演示

更多演示请查看GitHub


使用方法

LEETheme 提供了两种设置方式 这里做一下简单的演示:

独立设置方式

独立设置方式是对某一对象属性进行单独的配置 , 例如下面的例子 , 对view对象添加背景颜色 其中传入了2个参数 (@"主题标签" , [该主题标签对应的color值])

self.view.lee_theme.LeeAddBackgroundColor(DAY , [UIColor whiteColor]).LeeAddBackgroundColor(NIGHT , [UIColor blackColor]);

增加换行后 格式更加清晰

self.view.lee_theme
.LeeAddBackgroundColor(DAY , [UIColor whiteColor])
.LeeAddBackgroundColor(NIGHT , [UIColor blackColor]);
标识符设置方式

标识符设置方式是通过添加不同主题的JSON配置信息再为某对象设置指定标识符来实现切换的 , 下面模拟个例子:

json的标准格式:

{
    "color": {
        "identifier1(唯一标识符)": "十六进制颜色值",
        "identifier2": "#000000"
    },
    "image": {
        "identifier3(唯一标识符)": "图片名称",
        "identifier4": "lee.png"
    }
}

我有这样的两个json:

{
    "color": {
        "backgroundcolor": "#F0F0F0",
        "textcolor": "#000000"
    },
    "image": {
        "ident1": "lee.jpg",
        "ident2": "lee帅.png"
    }
}

第二个json:

{
    "color": {
        "backgroundcolor": "#000000",
        "textcolor": "#808080"
    },
    "image": {
        "ident1": "我爱LEE.jpg",
        "ident2": "LEE爱我.jpg"
    }
}

下面我们分别调用添加json的方法来讲这2个json添加给LEETheme:

//添加json设置数据 , 设置主题标签 , 设置资源路径(如果资源路径为nil 默认会在mainBundle中查询所需资源)
[LEETheme addThemeConfigWithJson:第一个json Tag:@"day" ResourcesPath:nil];

[LEETheme addThemeConfigWithJson:第二个json Tag:@"night" ResourcesPath:nil];

通过上面的代码可以很清楚的看出 , 我添加了一个json , 并设置主题标签为@"day" 那么也就是说第一个json 它对应的就是@"day"标签主题的配置信息 , 多主题情况依次类推.

添加好JSON的配置信息后 , 接下来我们只要为需要根据主题变化的对象设置标识符就可以了:

//设置背景颜色的标识符 , 这个标识符和你的json文件中配置的标识符对应
self.view.lee_theme.LeeConfigBackgroundColor(@"backgroundcolor");

这样只要为这些对象设置好对应的属性的标识符 , 那么当主题变换的时候 它就会自动根据相应主题JSON中的标识符的值进行设置.

切换主题

切换主题非常简单 只需要调用下面的方法 传入你要启用的主题的标签就可以了.

//启用主题
[LEETheme startTheme:@"day"];

这里建议使用时在didFinishLaunchingWithOptions代理方法中设置一下默认主题 , 这样在APP第一次开启时启用默认主题.

//设置默认主题
[LEETheme defaultTheme:@"day"];

当然如果你重新打开APP , 那么LEETheme会自动启用上一次使用的主题.


总结

LEETheme是一个非常实用的主题管理库 , 总共只有2个文件 , 它所提供的两种不同设置方式可以满足绝大部分Coder的需求 , 可以很方便的实现多主题切换操作 , 当然不仅可以实现本地固定的主题样式切换 , 利用标识符设置方式也可以实现网络主题切换的功能 , 具体详细的使用示例我会在demo中逐一体现 , 除了强大功能外 所采用的链式语法还让你的代码更加优雅 , 好了 , 今天就介绍到这里 , 更多详细的使用示例请灰到Github上查看.