iOS 使用 NSObject 的分类实现快速切换主题 - V2EX
CoderKo1o
V2EX    iOS

iOS 使用 NSObject 的分类实现快速切换主题

  •  
  •   CoderKo1o Dec 20, 2016 2780 views
    This topic created in 3431 days ago, the information mentioned may be changed or developed.

    PYTheme

    源码地址:https://github.com/iphone5solo/PYTheme

    源码分析:iOS 实现快速切换主题详细教程(附上源码)

    源码作者:CoderKo1o

    • An easy way to change theme through NSObject's category for iOS.
    • 通过 NSObject 的分类实现使用简单的主题更换。

    Features

    • 轻量级
    • 低耦合
    • 自动管理内存
    • 支持动态更换主题颜色
    • 支持动态更换主题图片
    • 支持 CocoaPods

    Requirements

    • iOS 7.0 or later
    • Xcode 7.0 or later

    Architecture

    • NSObject+PYThemeExtension

    Renderings

    Usage

    • 使用 CocoaPods:
      • pod "PYTheme"
      • 导入主头文件#import <NSObject+PYThemeExtension.h>
    • 手动导入:
      • PYTheme文件夹中的所有文件拽入项目中
      • 导入主头文件#import "NSObject+PYThemeExtension.h"

    具体使用

    设置主题色

    1. 添加控件的属性 /方法到主题色池中

    • 直接通过属性
     // 按钮的背景色添加到主题色池中 [button py_addToThemeColorPool:@"backgroundColor"]; 
    • 通过设置方法并且传入方法对应参数数组,参数中直接含有颜色参数
    // 设置按钮选中时字体颜色添加到主题色池中 [button py_addToThemeColorPoolWithSelector:@selector(setTitleColor:forState:) objects:@[PYTHEME_THEME_COLOR, @(UIControlStateSelected)]]; 
    • 当方法参数中没有直接包含颜色参数,而是经过包装(如使用 NSDictionary 包装)
     // 设置 tabBar 选中时字体颜色添加到主题色池中 NSMutableDictionary *attrSel = [NSMutableDictionary dictionary]; attrSel[NSForegroundColorAttributeName] = PYTHEME_THEME_COLOR; [childController.tabBarItem py_addToThemeColorPoolWithSelector:@selector(setTitleTextAttributes:forState:) objects:@[attrSel, @(UIControlStateSelected)]]; 

    2. 设置主题色

     // 设置主题色为红色 [self py_setThemeColor:[UIColor redColor]]; 

    设置主题图片与配色

    1. 添加相关控件对象到主题图片池中

     // 添加 tabBarItem 到主题图片池中 [tabBarItem py_addToThemeImagePool]; 

    2. 根据需求设置控件的相关属性

     // 重新加载主题图片,并设置主题色为红色 [self py_reloadThemeImageWithThemeColor:[UIColor redColor] setting:^(const NSArray<id> *objects) { // 根据控件类型完成相关设置 } 

    使用注意

    • 对象不能是UIAppearance,否则将无法添加到主题池中 如下:将导致 navigationBar 无法添加到主题色池中
     // 获取全局 navBar UINavigationBar *navBar = [UINavigationBar appearance]; // 添加背景色到主题色池中 [navBar py_addToThemeColorPool:@"barTintColor"]; 
    • 使用py_addToThemeColorPoolWithSelector:objects:设置参数数组时注意:

      • 方法参数必须按顺序一一对应,如果涉及到的主题色设置使用 PYTHEME_THEME_COLOR 宏定义代替
      • 如果数组中某个参数为 nil ,需包装为 [NSNull null] 对象再添加到数组中
    • 如果要使图片随着主题色变化而渲染成主题颜色,需要设置RenderingMode为: UIImageRenderingModeAlwaysTemplate

    期待

    • 如果您在使用过程中有任何问题,欢迎issue me! 很乐意为您解答任何相关问题!
    • 与其给我点 star ,不如向我狠狠地抛来一个 BU !
    • 如果想要参与这个项目的维护或者有好的功能,欢迎 pull request !
    • 如果您想要更多的接口来自定义或者建议 /意见,欢迎issue me!我会根据大家的需求提供更多的接口!
    • 如果您在使用中觉得略有不适,欢迎联系我 QQ:499491531 ,希望一起完善此项目,让它变成更强大,能够满足大多数用户的需求!

    Licenses

    All source code is licensed under the MIT License.

    2 replies    2016-12-20 18:58:47 +08:00
    so898
        1
    so898  
       Dec 20, 2016
    https://github.com/so898/CBPulse
    贴一个之前做的 Swift 实现,和楼主思路有点类似吧
    DingSoung
        2
    DingSoung  
       Dec 20, 2016
    为了这个功能,引入一个库,还要把所有色棕颜色大小等控件的方法改成第三方的,不仅影响面大,而且可能存在性能、安全等问题。
    正确的做法是写一个单利来管理所有的颜色、大小、图片等配置,这些颜色配置等按照规范放在 bundle 包里,一个 bundle 包代表一个主题,单例来管理病提供主题列表信息。切换主题, reload 一下 rootViewController 就好了
    About     Help     Advertise     Blog     API     FAQ     Solana     1035 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 77ms UTC 22:36 PVG 06:36 LAX 15:36 JFK 18:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86