主题换肤的实现

本文主要实现主题换肤的管理以及两个常用控件的封装
<h5>大致思路:</h5>
1.建立一个单例类(ThemeManager)专门用来进行主题皮肤的管理,专门负责查找图片和颜色。
2.封装出需要换肤的主要控件,包括UIButton、UIImageView等,方便在以后调用。
3.应用到各个控制器中。</br>

<h5>一、ThemeManager的实现</h5>
1.思路分析:</br>
(1)这是一个单例类,提供相同且唯一的实例。
(2)它只做两件事,一是查找图片,二查找颜色。
2.具体实现:

//.h文件
//1.设置属性
@property (copy, nonatomic) NSString *themeName; 
@property (strong , nonatomic) ThemeManager *manager;
@property (strong, nonatomic) NSDictionary *colorDic;
//2.方法声明
 + (id) shareThemeManger;

//找图片
- (UIImage *) getImageWithImageName:(NSString *) imageName;

//找颜色
- (UIColor *)getThemeColorWithColorName:(NSString *) colorName;

//.m文件
//构造方法的实现
+ (id) shareThemeManger {
    //设置静态变量为空
    static ThemeManager *instance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        instance = [[ThemeManager alloc] init];
    });
    return instance;
}

//初始化
- (instancetype) init {
    
    self = [super init];
    if (self) {

        //存储当前主题
        _themeName = [[NSUserDefaults standardUserDefaults]objectForKey:@"themeInfo"];
        
        if (_themeName == nil) {
            //设置默认主题
            _themeName = @"猫爷";
        }
        [self loadConfig];
    }
    return self;
}

//加载主题路径
- (NSString *) loadThemePath {
    //图片保存的路径是“.../Skins/主题名字”
    //查找plist文件
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Theme.plist" ofType:nil];
    //获取主题
    NSDictionary *DicTheme = [NSDictionary dictionaryWithContentsOfFile:filePath];
    
    //获取主题的短路径“/Skins/主题名字”
    NSString *themePath = [DicTheme objectForKey:_themeName];
    
    //拼接完整路径--将短路径拼接在大的路径后面
    NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePath];
    return path;
}
//得到图片名字
- (UIImage *) getImageWithImageName:(NSString *) imageName {
   //获取主题完整路径
    NSString *themePath = [self loadThemePath];
    //查找图片路径
    NSString *imgPath = [themePath stringByAppendingPathComponent:imageName];
    
    return [UIImage imageWithContentsOfFile:imgPath];
}
//复写ThemeName的set方法
- (void) setThemeName:(NSString *)themeName {
    
    //判断主题名字是否改变
    if (_themeName != themeName) {
        _themeName = themeName;
        //将改变后的主题存进UserDefault中
        NSUserDefaults *userD = [NSUserDefaults standardUserDefaults];
        [userD synchronize];//立即存储
        [userD setObject:_themeName forKey:@"themeInfo"];
    }
    
    //改变就发送通知
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ThemeChange" object:nil];
}

//获取config.plist---颜色
- (void) loadConfig {
    //拿到主题的完整路径
    NSString *themePath = [self loadThemePath];
    
    //获取config.plist文件
    NSString *filePath = [themePath stringByAppendingPathComponent:@"config.plist"];
    //获取plist文件中的字典
    _colorDic = [NSDictionary dictionaryWithContentsOfFile:filePath];

}
//找颜色
- (UIColor *)getThemeColorWithColorName:(NSString *) colorName {
    
    NSDictionary *rgbDic = _colorDic[colorName];
    
    double R = [rgbDic[@"R"] doubleValue];
    double G = [rgbDic[@"G"] doubleValue];
    double B = [rgbDic[@"B"] doubleValue];
    //判断一下有没有alpha,没有的话默认为1
    double alpha = [rgbDic[@"alpha"] doubleValue]  ?  : 1;
    
    return [UIColor colorWithRed:R/255 green:G/255 blue:B/255 alpha:alpha];
}

</br>

<h5>二、控件的封装</h5></br>

<h6>1.ThemeButton的封装</h6></br>

//设置属性--图片名
@property (nonatomic, strong) NSString *imageName;
//导入头文件
#import "ThemeManager.h"
- (void) setImageName:(NSString *)imageName {
    
    if (_imageName != imageName) {
        _imageName = imageName;
        
    }
    [self loadImage];
}
//加载图片
- (void) loadImage {
    
    ThemeManager *manager = [ThemeManager shareThemeManger];
    //调用getImageWithImageName:方法
    [self setImage:[manager getImageWithImageName:_imageName] forState:UIControlStateNormal];
}
//初始化
- (instancetype) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        //接收通知并实现方法,这里再次调用图片加载方法
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:@"ThemeChange" object:nil];
    }
    return self;
}

<h6>2..ThemeImageView的封装</h6>

@property (nonatomic, strong) NSString *imageName;
- (void) setImageName:(NSString *)imageName {
    
    if (_imageName != imageName) {
        _imageName = imageName;
        
    }
    [self loadImage];
}
- (void) loadImage {
    
    ThemeManager *manager = [ThemeManager shareThemeManger];
    UIImage *img =[manager getImageWithImageName:_imageName];

    self.image = [img stretchableImageWithLeftCapWidth:30 topCapHeight:30];

}
//初始化
- (instancetype) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:@"ThemeChange" object:nil];
    }
    return self;
}
- (void) dealloc {
    
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ThemeChange" object:nil];
}



<h5>三、应用</h5>

//设置标签栏背景图片
    ThemeImageView *backImgView = [[ThemeImageView alloc] initWithFrame:CGRectMake(0, -6, kScreenWidth, 55)];
    backImgView.imageName = @"图片名";
    [self.tabBar addSubview:backImgView];
float width = kScreenWidth/imaArr.count;
    //创建button
    for (int i=0; i < imaArr.count; i++) {
        NSString *imageName = imaArr[i];
        ThemeButton *button = [ThemeButton buttonWithType:UIButtonTypeCustom];
        button.imageName = imageName;
        button.frame = CGRectMake(i*width, 2, width, 45);
        button.tag = 2016 + i;
        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.tabBar addSubview:button];
    }

 //设置选中图片
    _selectedImage = [[ThemeImageView alloc] initWithFrame:CGRectMake(0, 4, width, 45)];
    _selectedImage.imageName = @"图片名";
    [self.tabBar addSubview:_selectedImage];
//设置内容视图背景图片
- (void) viewDidLoad {
    
    //1.加载图片
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadImag) name:@"ThemeChange" object:nil];
    
    [self loadImag];
}

- (void)loadImag{
    UIImage*img = [[ThemeManager shareThemeManger] getImageWithImageName:@"图片名"];
    
    self.view.backgroundColor = [UIColor colorWithPatternImage:img];
}

- (void)dealloc{
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ThemeChange" object:nil];
}
//设置导航栏背景图片
- (void) viewDidLoad {

    //设置标题颜色
    self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor],
                                               NSFontAttributeName : [UIFont boldSystemFontOfSize:20]};
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadImg) name:@"ThemeChange" object:nil];
    
    [self loadImg];
}

- (void)loadImg{
    ThemeManager *manager = [ThemeManager shareThemeManger];
    UIImage *img = [manager getImageWithImageName:@"图片名"];
    //设置背景颜色
    [self.navigationBar setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}

- (void)dealloc{
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ThemeChange" object:nil];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,683评论 22 664
  • 一般现在时:I make love with her everyday. 一般过去时:I made love wi...
    刘佳玲pp阅读 754评论 1 1
  • 不知何时, 喜欢: 伤春悲秋, 莫名感伤, 无病呻吟。 其实, 那么美的日子, 那么晴的天气, 那么开心的我。
    棠洛语阅读 167评论 0 1
  • 喜欢你,所以你就成了我的软肋 但如果有一天,失望攒得足够多, 我就会自动离开。 不要挽留我,我会祝福你。 在你心里...
    升先生和路宝阅读 156评论 0 0