iOS节假日换肤的实现

目前有很多APP都有着节假日换肤的功能,不同的人有这不同的实现思路,下面简单的概述一下本人的实现方式。

1、确定好需要变动的内容,将需要随时改变的地方尽量写成公共的(注:在需要改变时只需修改某一处即可,方便快捷),当然也可以使用判断条件,在需要变动时执行更改的那部分代码即可。如:导航栏的颜色、taBar 按钮的图片以及颜色、首页某个模块的样式等。

2、确定好需要变动的内容后,根据变动的需求将变动的内容以字典的形式写成plist文件。如:我需要修改taBar 按钮的图片以及颜色 就可以把plist文件写成一下形式:


3、新建一个文件夹 如命名为:tabbarItems ,将新的图片以及刚刚写好的plist文件放在该文件夹里面,如:



4、然后将该文件夹进行压缩,将压缩文件交给后台,让后台的同事找个地方存放起来,然后让后台在适当的接口返回一个参数用于是否需要进行下载更新操作,如首页返回 isDownloadSkin ,并且 新增一个接口用于下载你给后台的那个压缩文件,如果 isDownloadSkin == YES ,就 开辟子线程进行后台下载操作。一下为下载解压部分代码:

- (void)downLoadAndUnzip{

    //1.创建会话管理者

    AFHTTPSessionManager *manager =[AFHTTPSessionManager manager];

    NSURL *url = [NSURL URLWithString:@"http://1234567/data/upload/android/skin.zip"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //2.下载文件

    /*

    第一个参数:请求对象

     第二个参数:progress 进度回调 downloadProgress

     第三个参数:destination 回调(目标位置)

     有返回值

     targetPath:临时文件路径

     response:响应头信息

    第四个参数:completionHandler 下载完成之后的回调

   filePath:最终的文件路径

     */

    NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {

        //监听下载进度

  //completedUnitCount 已经下载的数据大小

 //totalUnitCount    文件数据的中大小

   NSLog(@"%f",1.0 *downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);

    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

        NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];

        return [NSURL fileURLWithPath:path];

//        return [NSURL fileURLWithPath:DocumentPath];

    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        _skinStatus =@"dowlond";

  NSString *imgFilePath = [filePath path];// 将NSURL转成NSString

   NSArray *documentArray =  NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

        NSString *path = [[documentArray lastObject] stringByAppendingPathComponent:@"Preferences"];

        [self releaseZipFilesWithUnzipFileAtPath:imgFilePath Destination:path];

        //解压完成, 至此皮肤资源已经完整缓存到沙盒, 删除zip包, 保存skinStatus

        NSFileManager *fileManager =  [NSFileManager defaultManager];

   [fileManager removeItemAtPath:imgFilePath error:nil];

 NSLog(@"%@ error:%@",response,error);

        NSLog(@"-----------------%@",filePath);

    }];

   //3.执行Task

   [download resume];

}


// 解压

- (void)releaseZipFilesWithUnzipFileAtPath:(NSString *)zipPath Destination:(NSString *)unzipPath{

    NSError *error;

    if ([SSZipArchive unzipFileAtPath:zipPath toDestination:unzipPath overwrite:YES password:nil error:&error delegate:nil]) {

        NSLog(@"解压 ---------success");

        NSLog(@"unzipPath = %@",unzipPath);

    }else {

      NSLog(@"解压 ---------%@",error);

    }

}

5、下载解压缩成功后 就可以对需要更换的地方进行替换。如更换tabBrItemSkin:例:

for (NSInteger i = 0; i <[WKSkinTool shareSkinTool].tabBrItemSkinArr.count; i ++) {// 换肤

        WKSkinItemModel * model =[WKSkinTool shareSkinTool].tabBrItemSkinArr[i];

        if (i ==0) {

            [self itemWithchildViewController:[[WKMallViewController alloc] init  ]withTitle:model.title normelImage:model.titleIconNor selectedImage:model.titleIconSel normelColor:WKColor(model.norRed, model.norGreen, model.norBlue) selectedColor:WKColor(model.selectRed, model.selectGreen, model.selectBlue)] ;

        }else if (i == 1){

            [self itemWithchildViewController:[[WKDiscoverViewController alloc]init]

                                      withTitle:model.title normelImage:model.titleIconNor selectedImage:model.titleIconSel normelColor:WKColor(model.norRed, model.norGreen, model.norBlue) selectedColor:WKColor(model.selectRed, model.selectGreen, model.selectBlue)] ;

        }else if (i == 2){

            [self itemWithchildViewController:[[WKChatViewController alloc] init ] withTitle:model.title normelImage:model.titleIconNor selectedImage:model.titleIconSel normelColor:WKColor(model.norRed, model.norGreen, model.norBlue) selectedColor:WKColor(model.selectRed, model.selectGreen, model.selectBlue)] ;

        }else{

        [self itemWithchildViewController:[[WKMeViewController alloc] init  ]withTitle:model.title normelImage:model.titleIconNor selectedImage:model.titleIconSel normelColor:WKColor(model.norRed, model.norGreen, model.norBlue) selectedColor:WKColor(model.selectRed, model.selectGreen, model.selectBlue)] ;

        }

    }


}

-(UIViewController *)itemWithchildViewController:(UIViewController *)childViewController withTitle:(NSString *)title normelImage:(NSString*)normelImage selectedImage:(NSString *)selectedImage normelColor:(UIColor*)normelColor selectedColor:(UIColor*)selectedColor {

    NSString * normelIm = [NSString stringWithFormat:@"%@/tabbarItems/%@",[[WKSkinTool shareSkinTool] getSkinPath ],normelImage];

    childViewController.tabBarItem.image = [[UIImage imageWithContentsOfFile:normelIm]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    NSString * selectedIm = [NSString stringWithFormat:@"%@/tabbarItems/%@",[[WKSkinTool shareSkinTool] getSkinPath ],selectedImage];

    childViewController.tabBarItem.selectedImage = [[UIImage imageNamed:selectedIm] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    // 设置 Itme的 title 及文字颜色

    childViewController.tabBarItem.title = title;

    NSMutableDictionary *nalAttr = [NSMutableDictionary dictionary];

    nalAttr[NSForegroundColorAttributeName] = normelColor;

    NSMutableDictionary * attr = [NSMutableDictionary dictionary];

    attr[NSForegroundColorAttributeName] =selectedColor;

    [ childViewController.tabBarItem setTitleTextAttributes:nalAttr forState:UIControlStateNormal];

    [childViewController.tabBarItem setTitleTextAttributes:attr forState:UIControlStateSelected];

    // 用导航控制器 包装 只控制器

    WKBaseNavigationController * nav = [[WKBaseNavigationController alloc]initWithRootViewController:childViewController];

    self.baseNavigationController=nav;

    // 将只控制器添加到 TabBarController

    [self  addChildViewController: nav];

    return childViewController;

}


shareSkinTool 工具类:

/******* 获取皮肤所在最外层公共路径 *******/

-(NSString *)getSkinPath{

    self.unzipPath=[[self getPath] stringByAppendingPathComponent:@"Preferences/skin"];

    return self.unzipPath ;

}

-(NSMutableArray *)tabBrItemSkinArr{ //tabbar 皮肤主题数组

    if (!_tabBrItemSkinArr) {

        NSString *filepath=[[self getPath] stringByAppendingPathComponent:@"Preferences/skin/tabbarItems/mallSkin.plist"];

 NSArray * temp =  [NSArray arrayWithContentsOfFile:filepath];

   _tabBrItemSkinArr = [WKSkinItemModel mj_objectArrayWithKeyValuesArray:temp];

    }

    return _tabBrItemSkinArr;

}

-(NSString * )getPath{

    NSArray *patharray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

NSString *path =  [patharray objectAtIndex:0];

    return path;

}

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

推荐阅读更多精彩内容