您的位置:首页 > 移动开发 > IOS开发

iOS-本地换肤思路

2016-05-17 09:35 453 查看
第一次写博客,想着写博客可以记录自己的所学所长,也能系统的整理一下自己的思路,以后会一直坚持下去。

一. 为什么要做换肤效果?

人都是视觉动物,再好的东西看久了也是会腻的,但是我们又不能因为这个而经常发布新版本,所以我们就想着是不是可以定时的切换app的皮肤,或者时用户自己手动切换皮肤呢?

二. 换肤可以做什么样的效果?

这也是我一直在思考的,我觉得,切换皮肤,不仅仅是要包含app的主题颜色,导航栏的颜色,菜单栏的颜色,肯定还是要包含那些跟主题颜色同色调的图片的,当然你还可以考虑是不是还可以切换其它的显示模式,比如可以把商品的显示由tableview显示,切换为collectionview显示。或者一些其它的什么。

三. 怎么做?

这里我写了一下自己的换肤思路,仅供参考。

我将需要切换的主题颜色,和需要切换的主题色调图片,全部整理出来,放到一个bundle里,同时加了其它的几个不同色调的bundle。





bundle中包括图片和一个plist文件,plist文件里我存放主题颜色的RGB颜色值,图片的命名方式全部一致。

怎样生成bundle包?其实非常简单,只要把文件夹的名字加上.bundle的后缀,文件包就自动生成了。

这样文件包已经形成,后面我们只要能从bundle包中针对的取出我们想要的数据和如何切换文件包就可以了。

1. 如何切换文件包呢,只要点击切换想要的肤色按钮,在响应事件中将配置文件包的缓存下来,等到取数据的时候可以直接针对的取出想要的数据。

这里用的最简单的沙盒缓存

- (IBAction)defaultThemeButtonAction:(id)sender {

    NSUserDefaults *userDefaults = [NSUserDefaultsstandardUserDefaults];

    [userDefaults setObject:<
4000
/span>@"Red"forKey:@"Theme"];

    [userDefaults synchronize];

    [self.navigationControllerpopViewControllerAnimated:YES];

}

2. 从配置文件包中取出主题颜色

+ (UIColor *)themeColor{

    NSUserDefaults *userDefaults = [NSUserDefaultsstandardUserDefaults];

    NSString *theme = [userDefaultsobjectForKey:@"Theme"];

    

    NSString *bundlePath = [[NSBundlemainBundle].resourcePathstringByAppendingPathComponent:[NSStringstringWithFormat:@"%@.bundle",theme]];

    NSBundle *themeBundle = [NSBundlebundleWithPath:bundlePath];

    NSString *plistPath = [themeBundlepathForResource:@"Theme"ofType:@"plist"];

    NSMutableDictionary *plistDict = [[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];

    UIColor *themeColor =RGB(230,82,
82);

    

    if (plistPath) {

        NSString *redStr = [plistDictobjectForKey:@"red"];

        NSString *greenStr = [plistDictobjectForKey:@"green"];

        NSString *blueStr = [plistDictobjectForKey:@"blue"];

        themeColor = [UIColorcolorWithRed:[redStr
floatValue] green:[greenStrfloatValue]
blue:[blueStrfloatValue]
alpha:1.0];

    }

    

    return themeColor;

}

3. 针对的取出相应的图片

+ (UIImage *)imageWithImageName:(NSString *)imageName

{

    NSUserDefaults *userDefaults = [NSUserDefaultsstandardUserDefaults];

    NSString *theme = [userDefaultsobjectForKey:@"Theme"];

    

    NSString *bundlePath = [[NSBundlemainBundle].resourcePathstringByAppendingPathComponent:[NSStringstringWithFormat:@"%@.bundle",theme]];

    NSBundle *themeBundle = [NSBundlebundleWithPath:bundlePath];

    NSString *imagePath = [themeBundlepathForResource:imageNameofType:@"png"];

    

    return [UIImageimageWithContentsOfFile:imagePath];

}

4.有了上述的方法,后面主题颜色,和主题色调图片就可以直接通过调用方法来取,这样就初步的完成了主题的切换了。

但是这样做了之后你会发现一些问题:
1. 一些静态页面的主题颜色和图片没有发生改变。
2. tabbar的颜色和图片没有切换
其实这些问题,只要重新打开app,就可以解决了,但是苹果不会让你重启应用。用户也不会切换皮肤后立刻退出重启
那么现在该怎么做,才能彻底的实现主题的切换呢?
既然想到了重启应用能够解决这一系列的办法,那么问题就简单了,我们只要实现重启应用的效果就可以了,没有必要真的重启应用。
我们只要在缓存之后,重启tabbar就可以了

NSUserDefaults *userDefaults = [NSUserDefaultsstandardUserDefaults];

        [userDefaults setObject:@"Blue"forKey:@"Theme"];

        [userDefaults synchronize];

        BaseTabbarController *baseTabbar = [[BaseTabbarControlleralloc]init];

        self.view.window.rootViewController
= baseTabbar;

到此!大功告成!

如果大家有更好的意见或建议,可以联系我!

代码下载:

GitHub:https://github.com/LearnMoreAndBetter/ThemeInsteadTest
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: