iOS皮肤

通过对HS项目的了解,有夜间模式和白天模式,恰逢男仔的项目中也要研究换肤,故对HS中用到的换肤操作进行以下简单的总结

分类

  • 换颜色(包括文字颜色,视图的背景等等)
  • 换素材(根据需求不同的模式下某些图片素材是不一样的)

大致思路

  • ios通过Bundle来存储不同的皮肤
  • 将白天和夜晚两套皮肤存储到本地(由于只有两种模式,故暂时考虑存储到本地)
  • 标记位标识不同的皮肤,并将标记位用文件持久化(HS项目中采用的是NSUserDefault)记录到本地
  • 当皮肤改变的时候,改变本地标记位,并用通知的方式传递给其他的视图

基础准备

  • 新建两个不同的bundle,用于存储两个模式的素材以及颜色列表


    iOS皮肤_第1张图片
    bundle列表

    iOS皮肤_第2张图片
    bundle结构图
  • 每个bundle下主要存储两类文件,图片素材名字和颜色名称列表,两个bundle的两类素材名字要一一对应。颜色的名字在plist中的位置也要保持一一对应,便于查找和更改
    iOS皮肤_第3张图片
    夜间图片素材示例

    iOS皮肤_第4张图片
    白天图片素材示例

    iOS皮肤_第5张图片
    夜间颜色列表示例

    iOS皮肤_第6张图片
    白天颜色列表示例

文字颜色

  • 新建一个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)

你可能感兴趣的:(iOS皮肤)