LEETheme优雅的主题管理库

作者: 与伟大LEE同行 | 来源:发表于2016-06-10 11:41 被阅读1855次

    前言

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

    LEETheme

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


    效果演示

    朋友圈Demo演示

    使用方法

    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上查看.

    我是LEE , 一枚有信仰的果粉Coder , 如果喜欢记得关注哦 亲 ~ 么了个哒 

    相关文章

      网友评论

      • 阿唯不知道:// tabBar标签颜色渲染(不知该如何调用Lee方法)
        UITabBarItem *item = [UITabBarItem appearance];
        // 未选中字体颜色
        [item setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor darkGrayColor],
        NSFontAttributeName:AAFont(11)
        }
        forState:UIControlStateNormal];
        // 选中字体颜色
        [item setTitleTextAttributes:@{NSForegroundColorAttributeName:kAppMainColor,
        NSFontAttributeName:AAFont(11)
        }
        forState:UIControlStateSelected];
      • 曾经像素有点低:这个json表一直看不明白是用来干什么的。是存储颜色、图片名字什么的吗?那么多皮肤下的一个icon,应该对应多个图片名字。就是存储也得一个key对应多个value吧。不太明白怎么用。。。
        曾经像素有点低:看了一下你github上的demo,秒懂!收藏了
        // 添加背景颜色
        imageView.lee_theme
        .LeeAddBackgroundColor(@"red" , [UIColor redColor])
        .LeeAddBackgroundColor(@"blue" , [UIColor blueColor]);

        // 添加图片
        imageView.lee_theme
        .LeeAddImage(@"red" , [UIImage imageNamed:@"red.png"])
        .LeeAddImage(@"blue" , [UIImage imageNamed:@"blue.png"]);
      • VVik:很不错的库,支持开源的奉献精神!
      • Hengry:如何动态切换按钮上的图片呢?
        Hengry:@与伟大LEE同行 UISegmentedControl 可以设置选择文字的颜色吗
        Hengry:@与伟大LEE同行 👌
        与伟大LEE同行:@DevHank .LeeAddButtonImage(@"tag", [UIImage imageNamed:@"true_day"], UIControlStateNormal)
        或者
        .LeeConfigButtonImage(@"ident", UIControlStateNormal);
      • 风之谷等风来:为开源点赞,真的很好
        风之谷等风来:@与伟大LEE同行 不用客气
        与伟大LEE同行:感谢支持
      • 492e423db474:大神你好,我想问下,如果是要改变全局的图标样式(包括按钮,tabbar,navgationbar 等等 类似于安卓手机主题那样的)该怎么实现啊? 有类似的demo吗?谢谢~~~
      • Hengry:这个库真的好用。我想添加一个全局的开关,控制是否开启或者关闭皮肤。这怎么实现呢?感觉这个开关挺实用的。
        与伟大LEE同行:@DevHank 这个你只要控制启用哪个主题就可以做到了吧
      • End_af9c:我在启动设置了 默认主题白天的, 然后点击切换夜间的,之后杀死程序,在进入 还是保持夜间模式的吗? 不应该是 启动的默认白天吗?
        End_af9c:@与伟大LEE同行 默认是这个意思理解啦 ! 这个跟腾讯新闻的也是一个意思 没点击切换的模式 不管退出杀死都保持着当前点击的模式! 谢谢了·挺好用的·继续关注
        与伟大LEE同行:@End_af9c 或者你当前启用的是一个新加的主题,当你把这个主题移除后,当前的主题已经不存在了,这时也会自动启用默认的主题
        与伟大LEE同行:@End_af9c 不是的,再进入会自动启动你上一次的主题。默认的主题不是这个意思的,举个例子,第一次启动程序,你还从未启用的一个主题,也不会知道上一次是什么,这时就会启用默认的那个主题
      • 迷路的安然和无恙:作者你好,我想参与你的SDKit开源组件库的工程,可以吗?
        迷路的安然和无恙:@与伟大LEE同行 :joy: 那好吧,有动静的时候叫上我哈,一起商量怎么干:stuck_out_tongue_closed_eyes:
        与伟大LEE同行:@as_one :cold_sweat:说来尴尬,那个是sdautolayout的作者发起的,不过后来因为大家工作太忙一直没什么进展了
      • xiaoyouPrince:以前在高少东的SDAutoLayout库中看到过LEETheme这个主题管理库,没想到在这又看到了,谢谢分享!
        与伟大LEE同行:@xiaoyouPrince 我这个demo没怎么写,所以直接在他的demo里面用了,哈哈
        与伟大LEE同行:@xiaoyouPrince :smile:
      • 7emini:我是LEE的吹箫童子~
        c45c75ce4a5f:@与伟大LEE同行 哈哈,太明显了。:blush:
        与伟大LEE同行:@JasonLeee 哈哈,你看出来了?
        c45c75ce4a5f:毛,你是 干瘪。
      • 小妖游子:LEE神,强,无敌!

      本文标题:LEETheme优雅的主题管理库

      本文链接:https://www.haomeiwen.com/subject/vqpjdttx.html