通过对HS项目的了解,有夜间模式和白天模式,恰逢男仔的项目中也要研究换肤,故对HS中用到的换肤操作进行以下简单的总结
分类
- 换颜色(包括文字颜色,视图的背景等等)
- 换素材(根据需求不同的模式下某些图片素材是不一样的)
大致思路
- ios通过Bundle来存储不同的皮肤
- 将白天和夜晚两套皮肤存储到本地(由于只有两种模式,故暂时考虑存储到本地)
- 标记位标识不同的皮肤,并将标记位用文件持久化(HS项目中采用的是NSUserDefault)记录到本地
- 当皮肤改变的时候,改变本地标记位,并用通知的方式传递给其他的视图
基础准备
-
新建两个不同的bundle,用于存储两个模式的素材以及颜色列表
- 每个bundle下主要存储两类文件,图片素材名字和颜色名称列表,两个bundle的两类素材名字要一一对应。
颜色的名字在plist中的位置也要保持一一对应,便于查找和更改
文字颜色
- 新建一个UIColor的分类,在分类中主要做以下工作:
- 通过颜色列表plist,获取一个颜色字典
- 通过不同key值在颜色列表中选取颜色(本项目中的颜色是同的16进制的颜色)
/// 获取颜色字典
private static var colorDict: NSDictionary {
get {
if let skinKey = NSUserDefaults.standardUserDefaults().stringForKey(kUserDefaultsSkin) {
let path = NSBundle.mainBundle().pathForResource("\(skinKey)", ofType: "bundle")
return NSDictionary(contentsOfFile: path!+"/ColorInfo.plist")!
} else {
let path = NSBundle.mainBundle().pathForResource("Normal", ofType: "bundle")
return NSDictionary(contentsOfFile: path!+"/ColorInfo.plist")!
}
}
}
/// 通过key值获取颜色
static func colorForKey(key: String) -> UIColor {
let colorHex = colorDict[key] as! NSString
return UIColor.colorWithHexString(colorHex)
}
/// 颜色调用【key值要和plist一一对应】
static func currentContentFontColor() -> UIColor {
return colorForKey("ContentFontColor")
}
```
* 新加颜色的步骤
* 首先确定好某控件的夜间和白天的十六进制颜色数值【一般UI或者产品会提供】
* 确定方法名字,即plist的key值
![plist添加值示例](http://upload-images.jianshu.io/upload_images/954728-a41ad2f61efde906.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 颜色分类中添加方法
static func currentCommentInputBgColor() -> UIColor {
return colorForKey("CommentInputBgColor")
}
# 图片素材
* 在不同的budle的相同路径下添加一组白天和夜间模式的图片,要求图片的名字一直,外部所属的文件夹名一致
![夜间图片素材示例](http://upload-images.jianshu.io/upload_images/954728-4201a11e945f3e3d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![白天图片素材示例](http://upload-images.jianshu.io/upload_images/954728-8e1d7de49ae6d7ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 在系统UIImage的分类中添加一个方法,用路径作为参数,其中路径参数是格式为“蓝色文件夹名/图片名”
/// 核心方法
class func currentSkinImage(name: String) -> UIImage? {
var path = ""
if let skinKey = NSUserDefaults.standardUserDefaults().stringForKey(kUserDefaultsSkin) {
path = NSBundle.mainBundle().pathForResource("\(skinKey)", ofType: "bundle")!
} else {
path = NSBundle.mainBundle().pathForResource("Normal", ofType: "bundle")!
}
let originImage = UIImage(contentsOfFile: "\(path)/\(name)")
originImage?.imageWithRenderingMode(.AlwaysOriginal)
if originImage == nil {
print(self, "image path maybe wrong, path is \(path)/\(name)")
}
return originImage
}
// 使用场景代码
coverSetFlagView.image = UIImage.currentSkinImage("album/camera1")
> 如有不明白的详见[demo](https://github.com/xqqq0/NightSkin)