第一次写博客,想着写博客可以记录自己的所学所长,也能系统的整理一下自己的思路,以后会一直坚持下去。
一. 为什么要做换肤效果?
人都是视觉动物,再好的东西看久了也是会腻的,但是我们又不能因为这个而经常发布新版本,所以我们就想着是不是可以定时的切换app的皮肤,或者时用户自己手动切换皮肤呢?
二. 换肤可以做什么样的效果?
这也是我一直在思考的,我觉得,切换皮肤,不仅仅是要包含app的主题颜色,导航栏的颜色,菜单栏的颜色,肯定还是要包含那些跟主题颜色同色调的图片的,当然你还可以考虑是不是还可以切换其它的显示模式,比如可以把商品的显示由tableview显示,切换为collectionview显示。或者一些其它的什么。
三. 怎么做?
这里我写了一下自己的换肤思路,仅供参考。
我将需要切换的主题颜色,和需要切换的主题色调图片,全部整理出来,放到一个bundle里,同时加了其它的几个不同色调的bundle。
bundle中包括图片和一个plist文件,plist文件里我存放主题颜色的RGB颜色值,图片的命名方式全部一致。
怎样生成bundle包?其实非常简单,只要把文件夹的名字加上.bundle的后缀,文件包就自动生成了。
这样文件包已经形成,后面我们只要能从bundle包中针对的取出我们想要的数据和如何切换文件包就可以了。
1. 如何切换文件包呢,只要点击切换想要的肤色按钮,在响应事件中将配置文件包的缓存下来,等到取数据的时候可以直接针对的取出想要的数据。
这里用的最简单的沙盒缓存
- (IBAction)defaultThemeButtonAction:(id)sender {
NSUserDefaults *userDefaults = [NSUserDefaultsstandardUserDefaults];
[userDefaults setObject:@"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