主題切換

主題切換在前幾年很火的一個技術寂祥,俗稱換膚贷掖!
今天我們來實現下這個主題是怎么切換的。
主體思路:
1.要求的圖片名是一樣的孽糖,換的是文件夾的名稱枯冈,就是換的路徑,所以要求的主題路徑是不一樣的办悟。
2.創(chuàng)建一個工具類,根據plist文件找到對應的主題尘奏,實現圖片路徑的加載。并且創(chuàng)建一個對外的屬性病蛉,就是切換的主題名炫加。
3.監(jiān)聽切換的主題,對此發(fā)送通知铺然,進行實時修改俗孝。
另外要導入的圖片要真實的文件夾,圖片名稱一樣魄健,放在不同的文件夾下面赋铝。

上代碼:
工具類:.h

//
//  StyleTools.h
//  ChangeStyle-Demo
//
//  Created by mac on 16/8/25.
//  Copyright ? 2016年 mac. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface StyleTools : NSObject

@property(nonatomic,copy)NSString *style;

+(instancetype)sharedManager;

-(UIImage *)getImageName:(NSString *)name;

@end

//
//  StyleTools.m
//  ChangeStyle-Demo
//
//  Created by mac on 16/8/25.
//  Copyright ? 2016年 mac. All rights reserved.
//

#import "StyleTools.h"

static StyleTools *instance = nil;

@implementation StyleTools

+(instancetype)sharedManager{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[StyleTools alloc] init];
    });
    return instance;
}


- (instancetype)init
{
//設置初始主題(這里可以保存在沙盒中,以防止下次取出的時候又回到初始主題沽瘦,本人就沒寫了)
    self = [super init];
    if (self) {
        _style = @"村落";
    }
    return self;
}

-(NSString *)loadImagePath{
    //獲取主題數據路徑
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Theme" ofType:@"plist"];
    //字典
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
    //主題名
    NSString *styleName = [dic objectForKey:_style];
    
    //真實路徑
    NSString *stylePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:styleName];
    
    return stylePath;
}

-(UIImage *)getImageName:(NSString *)imageName{
    
    //
    NSString *stylePath = [self loadImagePath];
    //圖片的路徑
    NSString *imagePath = [NSString stringWithFormat:@"%@/%@",stylePath,imageName];
    
    UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
    //返回圖片
    return image;
}

-(void)setStyle:(NSString *)style{
    _style = style;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"StyleName" object:nil];
}
@end

標簽欄的實現柬甥。

//
//  BaseViewController.m
//  ChangeStyle-Demo
//
//  Created by mac on 16/8/25.
//  Copyright ? 2016年 mac. All rights reserved.
//

#import "BaseViewController.h"
#import "StyleTools.h"
@interface BaseViewController (){
    NSArray *array;
}

@end

@implementation BaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self loadData];
    [self createBase];
}

-(void)loadData{
    
    array = [NSArray array];
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Theme" ofType:@"plist"];
    //字典
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
    //獲取到所有鍵
    array = [dic allKeys];

}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self removeSystemTabbar];
}

-(void)createBase{
    StyleTools *manager = [StyleTools sharedManager];
    NSArray *imgArr = @[
                        @"home_tab_icon_1.png",
                        @"home_tab_icon_2.png",
                        @"home_tab_icon_3.png",
                        @"home_tab_icon_4.png",
                        @"home_tab_icon_5.png"
                        ];
    
    for (int i = 0; i<imgArr.count; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[manager getImageName:imgArr[i]] forState:UIControlStateNormal];
        button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/imgArr.count * i, 3, 50, 50);
        button.tag = 1000 + i;
        [button addTarget:self action:@selector(changeAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.tabBar addSubview:button];
    }
    
    
    //接收通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:@"StyleName" object:nil];
    [self loadImage];
}

-(void)loadImage{
    //這里可以做代碼優(yōu)化,自創(chuàng)一個button類其垄,進行封裝就不用寫五個了
    StyleTools *manager = [StyleTools sharedManager];
    
    NSArray *imgArr = @[
                        @"home_tab_icon_1.png",
                        @"home_tab_icon_2.png",
                        @"home_tab_icon_3.png",
                        @"home_tab_icon_4.png",
                        @"home_tab_icon_5.png"
                        ];
    UIButton *button1 = (UIButton *)[self.view viewWithTag:1000];
    [button1 setImage:[manager getImageName:imgArr[0] ]forState:UIControlStateNormal];
    UIButton *button2 = (UIButton *)[self.view viewWithTag:1001];
    [button2 setImage:[manager getImageName:imgArr[1] ]forState:UIControlStateNormal];
    UIButton *button3 = (UIButton *)[self.view viewWithTag:1002];
    [button3 setImage:[manager getImageName:imgArr[2] ]forState:UIControlStateNormal];
    UIButton *button4 = (UIButton *)[self.view viewWithTag:1003];
    [button4 setImage:[manager getImageName:imgArr[3] ]forState:UIControlStateNormal];
    UIButton *button5 = (UIButton *)[self.view viewWithTag:1004];
    [button5 setImage:[manager getImageName:imgArr[4] ]forState:UIControlStateNormal];
    self.tabBar.backgroundImage = [manager getImageName:@"mask_navbar.png"];
}

-(void)changeAction:(UIButton *)button{
    
//    NSLog(@"%@",button.titleLabel.text);
    NSInteger index = button.tag - 1000;
    
    StyleTools *manager = [StyleTools sharedManager];
    //將主題獲取到?疗选!绿满!
    manager.style = array[index];
    
}

-(void)removeSystemTabbar{
    //移除自創(chuàng)標題
    for (UIView *view in self.tabBar.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            [view removeFromSuperview];
        }
    }
}
#pragma mark -手動釋放通知
-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"StyleName" object:nil];
}


@end

navigationcontroller中

//
//  NavigationViewController.m
//  ChangeStyle-Demo
//
//  Created by mac on 16/8/25.
//  Copyright ? 2016年 mac. All rights reserved.
//

#import "NavigationViewController.h"
#import "StyleTools.h"
@interface NavigationViewController ()

@end

@implementation NavigationViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:@"StyleName" object:nil];
    [self loadImage];
}

-(void)loadImage{
    StyleTools *manager = [StyleTools sharedManager ];
    self.view.backgroundColor = [UIColor colorWithPatternImage:[manager getImageName:@"mask_titlebar64@2x.jpg"]];
}
-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"StyleName" object:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}


@end

viewcontroller中

//
//  ViewController.m
//  ChangeStyle-Demo
//
//  Created by mac on 16/8/25.
//  Copyright ? 2016年 mac. All rights reserved.
//

#import "ViewController.h"
#import "StyleTools.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    /*
     切換主題:
     主體思路就是切換文件夾
     1.獲取到真實文件夾
     2.監(jiān)聽文件夾的名稱
     3.切換
     */

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:@"StyleName" object:nil];
    [self loadImage];
}
-(void)loadImage{
    StyleTools *manager = [StyleTools sharedManager ];
    self.view.backgroundColor = [UIColor colorWithPatternImage:[manager getImageName:@"bg_home@2x.jpg"]];
}

-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"StyleName" object:nil];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

先看看效果:

stylechange1.gif

···

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末臂外,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子喇颁,更是在濱河造成了極大的恐慌漏健,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘霎,死亡現場離奇詭異蔫浆,居然都是意外死亡,警方通過查閱死者的電腦和手機姐叁,發(fā)現死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門瓦盛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洗显,“玉大人,你說我怎么就攤上這事原环∧铀簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵嘱吗,是天一觀的道長玄组。 經常有香客問我,道長谒麦,這世上最難降的妖魔是什么俄讹? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮绕德,結果婚禮上患膛,老公的妹妹穿的比我還像新娘。我一直安慰自己迁匠,他們只是感情好剩瓶,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著城丧,像睡著了一般延曙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亡哄,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天枝缔,我揣著相機與錄音,去河邊找鬼蚊惯。 笑死愿卸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的截型。 我是一名探鬼主播趴荸,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宦焦!你這毒婦竟也來了发钝?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤波闹,失蹤者是張志新(化名)和其女友劉穎酝豪,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體精堕,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡孵淘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了歹篓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫证。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡揉阎,死狀恐怖,靈堂內的尸體忽然破棺而出痛悯,到底是詐尸還是另有隱情余黎,我是刑警寧澤重窟,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布载萌,位于F島的核電站,受9級特大地震影響巡扇,放射性物質發(fā)生泄漏扭仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一厅翔、第九天 我趴在偏房一處隱蔽的房頂上張望乖坠。 院中可真熱鬧,春花似錦刀闷、人聲如沸熊泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顽分。三九已至,卻和暖如春施蜜,著一層夾襖步出監(jiān)牢的瞬間卒蘸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工翻默, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缸沃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓修械,卻偏偏與公主長得像趾牧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肯污,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容

  • 前言 隨著一款APP應用功能的不斷完善翘单,用戶群體的不斷增多,APP的更新也就不僅僅局限于功能需求仇箱,如何做好良好的用...
    采蘑菇的里奧馬閱讀 27,884評論 43 146
  • 利用通知NSNotificationCenter和NSUserDefaults實現主題切換县恕。1.先上效果圖: 3....
    keep_moving閱讀 5,137評論 2 24
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評論 25 707
  • 今有一友忠烛,因讀下文,而欲徹底關閉微信圈圈: 我隨即以“施主权逗、貧僧”戲謔方式開言美尸,勸之如下: 施主冤议,你著象了。請聽貧...
    絕對瘋了閱讀 830評論 1 2
  • 早課問題及答案 第二次早課 1师坎、vi命令的三種模式恕酸,使用什么命令切換? 2胯陋、vi命令蕊温,假如一個記事本,按什么鍵跳到...
    蘇木logwood閱讀 271評論 3 0