主题切换

原创 2015年11月19日 11:30:37

//更主题的通知

#define ThemeChangeNotification @"ThemeChangeNotification"  //更改主题的通知

#define ThemeName @"ThemeName"                              //主题名称


#import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>


@interface ConfigurationTheme : NSObject{

@private

    //主题配置信息

    NSDictionary *_themesConfig;

}


@property (copy, nonatomic) NSString *themeName;            //当前使用的主题名称

@property (strong, nonatomic) NSDictionary *themesConfig;   //主题配置信息

@property (strong, nonatomic) NSDictionary *fontConfig; //字体的配置信息


//创建单例,确保该对象唯一

+ (ConfigurationTheme *)shareInstance;


//获取当前主题下的图片名称

-(UIImage *)getThemeImageName:(NSString *)imageName;

//获取当前主题下的颜色

- (UIColor *)getThemeColorWithName:(NSString *)colorName;


@end


#import "ConfigurationTheme.h"


@implementation ConfigurationTheme


//创建单例,确保该对象唯一

+ (ConfigurationTheme *)shareInstance{

    

    static ConfigurationTheme *configuration = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        configuration = [ConfigurationTheme new];

    });

    return configuration;

}


//重写init方法

-(id)init{

    

    self = [super init];

    if (self != nil) {

        

        //读取主题配置文件

        NSString *filePlist = [[NSBundle mainBundle] pathForResource:@"theme" ofType:@"plist"];

        _themesConfig = [NSDictionary dictionaryWithContentsOfFile:filePlist];

        

        //读取字体配置文件

        NSString *fontConfigPlist = [[NSBundle mainBundle] pathForResource:@"fontColor" ofType:@"plist"];

        

        _fontConfig = [NSDictionary dictionaryWithContentsOfFile:fontConfigPlist];

        

        self.themeName = @"默认";

    }

    

    return  self;

}


//得到当前主题名称

- (void)setThemeName:(NSString *)themeName{

    if (_themeName != themeName) {

        _themeName = [themeName copy];

    }

    

    //获取主题配置的根目录

    NSString *themePath = [self getThemePath];

    NSString *filePath = [themePath stringByAppendingPathComponent:@"fontColor.plist"];

    _fontConfig = [NSDictionary dictionaryWithContentsOfFile:filePath];

    

}


//获取当前主题配置的目录

- (NSString *)getThemePath{

    

    //项目的根路径

    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];

    

    if ([_themeName isEqualToString:@"默认"]) {

        return resourcePath;

    }

    

    //获取当前主题的配置路径

    NSString *configurationPath = [_themesConfig objectForKey:_themeName];

    

    //主题的完整路径

    NSString *themePath = [resourcePath stringByAppendingPathComponent:configurationPath];

    

    return themePath;

}


//获取当前主题下的图片

-(UIImage *)getThemeImageName:(NSString *)imageName{

    if (imageName.length == 0) {

        return nil;

    }

    //获取当前主题配置的目录

    NSString *configurationPath = [self getThemePath];

    //图片名称在当前主题的文件路径

    NSString *imagePath = [configurationPath stringByAppendingPathComponent:imageName];

    UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

    

    return image;

}


//获取当前主题下的颜色

- (UIColor *)getThemeColorWithName:(NSString *)colorName{

    if (colorName.length == 0){

        return nil;

    }

    

    NSString *rgb = [self.fontConfig objectForKey:colorName];

    NSArray *rgbs = [rgb componentsSeparatedByString:@","];

    

    if (rgbs.count == 3)

    {

        float r = [rgbs[0] floatValue];

        float g = [rgbs[1] floatValue];

        float b = [rgbs[2] floatValue];

        UIColor *color = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1];

        return color;

    }

    

    return nil;

}


+ (id)copyWithZone:(NSZone *)zone

{

    return self;

}



@end

配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>默认</key>

<string>Skins/default</string>

<key>nt</key>

<string>Skins/nt</string>

</dict>

</plist>

使用:

_switchButton = [[UISwitch alloc] initWithFrame:CGRectMake(screenWidth-20-42, 15, 42, 22)];

            

            //根据沙盒里的值来控制switch的开关

            NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

            NSString *passWord = [ user objectForKey:@"userPassWord"];

            if (!(passWord == nil) && [passWord isEqualToString:@"123456"]){

                [_switchButton setOn:NO];

            }else{

                [_switchButton setOn:YES];

            }

            

            _switchButton.tag=indexPath.row+10001;

            [_switchButton addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];

            

            [cell.contentView addSubview:_switchButton];


-(void)switchAction:(id)sender{


    //取出选中的主题名称

    NSString *themeName = [ConfigurationTheme shareInstance].themeName;

    

    if ([themeName isEqualToString:@"默认"]){

        themeName = @"nt";


        //往沙盒存个值

        NSString *passWord = @"11111";

        NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

        [user setObject:passWord forKey:@"userPassWord"];

        

    }else{

        

        themeName = @"默认";

        //往沙盒存个值

        NSString *passWord = @"123456";

        NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

        [user setObject:passWord forKey:@"userPassWord"];

    }

    

    [ConfigurationTheme shareInstance].themeName = themeName;

    [[NSNotificationCenter defaultCenter] postNotificationName:ThemeChangeNotification object:nil];

    //保存主题到本地

    [[NSUserDefaults standardUserDefaults] setObject:themeName forKey:ThemeName];

    [[NSUserDefaults standardUserDefaults] synchronize];

    

    [_myTableView reloadData];

}




Theme切换(主题切换)

实现手动切换主题效果1.第一步,配置实现 attr
  • qq_16666847
  • qq_16666847
  • 2016年11月27日 22:48
  • 359

iOS实现主题切换技术点之一

主题切换技术关键点: 1,主题切换原理: 主要利用的是通知:因为切换主题需要所有满足切换的类都发生改变,这就是广播模式。 通知的实质:告诉需要做主题切换的控件图片路径发生了改变,从新的路径中重新...
  • BaiHuaXiu123
  • BaiHuaXiu123
  • 2016年02月29日 20:50
  • 905

一步一步教你实现主题切换功能

现在市面上好多App都支持主题切换功能,所谓主题切换就是当从一种主题切换到另一种主题时,并不只是单单的修改了一下背景颜色,而是将整个App的背景、字体样式、图标等都进行了一系列的修改,并且风格应该统一...
  • zxm317122667
  • zxm317122667
  • 2016年09月28日 11:37
  • 1248

主题切换css

html代码,将样式置为空: js代码 window.onload=initAll; function initAll() { document.getElementById("zhuti...
  • Anstoner
  • Anstoner
  • 2017年05月17日 09:41
  • 448

关于YII动态切换主题的问题

网上找了好久木有找到资料,然后自己尝试,自己解决了。        解决方法如下:...
  • shenchui
  • shenchui
  • 2014年04月19日 20:47
  • 380

Android主题切换方案总结

做了两年多Android应用开发了,期间也实现过好几种主题切换的方式。趁着最近有空,总结一下。 所谓的主题切换,就是能够根据不同的设定,呈现不同风格的界面给用户,也就是所谓的换肤。 1、将...
  • xingfeng2010
  • xingfeng2010
  • 2014年04月03日 10:47
  • 31000

android主题切换

步骤: 1.在attr.xml下定义style变量 2.在style.xml下编写不同的主题,不同主题引用attr.xml中定义好的变量设置不同的属性 3.在布局文件中控件相应属性引用att...
  • getchance
  • getchance
  • 2015年08月05日 11:38
  • 733

安卓主题切换

1自定义部分属性1. 2. 3. 4. 5.
  • lin_t_s
  • lin_t_s
  • 2016年11月10日 10:55
  • 190

app 主题切换

1.添加主题包到工程中,选中Create Folder references生成蓝色的文件夹 2.定义一个主题管理者(当主题切换时,发送通知)单例; 3.使用工厂模式自定义控件(接受通知) 1....
  • DY_blog
  • DY_blog
  • 2015年04月21日 19:20
  • 224

Android 主题切换

介绍 所谓的多主题切换,就是能够根据不同的设定,呈现不同风格的界面给用户。想实现Android多套主题的切换,网络上方案已经很多了,也看了许多大神的实现方式,但心里总想着自己去实现一遍,就这么借鉴G...
  • utomi
  • utomi
  • 2017年06月07日 11:49
  • 212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:主题切换
举报原因:
原因补充:

(最多只允许输入30个字)