通過對HS項目的了解僧界,有夜間模式和白天模式,恰逢男仔的項目中也要研究換膚捂襟,故對HS中用到的換膚操作進行以下簡單的總結(jié)
分類
- 換顏色(包括文字顏色,視圖的背景等等)
- 換素材(根據(jù)需求不同的模式下某些圖片素材是不一樣的)
大致思路
- ios通過Bundle來存儲不同的皮膚
- 將白天和夜晚兩套皮膚存儲到本地(由于只有兩種模式涨共,故暫時考慮存儲到本地)
- 標記位標識不同的皮膚宠漩,并將標記位用文件持久化(HS項目中采用的是NSUserDefault)記錄到本地
- 當皮膚改變的時候,改變本地標記位火鼻,并用通知的方式傳遞給其他的視圖
基礎(chǔ)準備
-
新建兩個不同的bundle,用于存儲兩個模式的素材以及顏色列表
bundle列表
bundle結(jié)構(gòu)圖 - 每個bundle下主要存儲兩類文件融撞,圖片素材名字和顏色名稱列表蛾默,兩個bundle的兩類素材名字要一一對應(yīng)。
顏色的名字在plist中的位置也要保持一一對應(yīng)冬念,便于查找和更改
夜間圖片素材示例
白天圖片素材示例
夜間顏色列表示例
白天顏色列表示例
文字顏色
- 新建一個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)
}
/// 顏色調(diào)用【key值要和plist一一對應(yīng)】
static func currentContentFontColor() -> UIColor {
return colorForKey("ContentFontColor")
}
```
* 新加顏色的步驟
* 首先確定好某控件的夜間和白天的十六進制顏色數(shù)值【一般UI或者產(chǎn)品會提供】
* 確定方法名字寺晌,即plist的key值

* 顏色分類中添加方法
static func currentCommentInputBgColor() -> UIColor {
return colorForKey("CommentInputBgColor")
}
# 圖片素材
* 在不同的budle的相同路徑下添加一組白天和夜間模式的圖片,要求圖片的名字一直耘婚,外部所屬的文件夾名一致


* 在系統(tǒng)UIImage的分類中添加一個方法陆赋,用路徑作為參數(shù),其中路徑參數(shù)是格式為“藍色文件夾名/圖片名”
/// 核心方法
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)