Swift3.0-16進位制顏色轉換UIColor

weixin_33785972發表於2016-10-21

參考原文:http://www.jianshu.com/p/345fa430e44

原樓主使用swift2.x 編寫,對於swift3.0 已不能正常使用,故此針對swift3.0語法,做出以下修改。

具體怎麼新建檔案,參考原文。在這裡不再重複步驟,只提供修改的內容。謝謝

import UIKit

// MARK: - 給UIColor寫兩個類方法
extension UIColor {
    /**
     16進位制轉UIColor
     
     - parameter hex: 16進位制顏色字串
     
     - returns: 轉換後的顏色
     */
    class func ColorHex(hex: String) -> UIColor {
        return proceesHex(hex: hex, alpha: 1.0)
    }
    
    /**
     16進位制轉UIColor,
     
     - parameter hex:   16進位制顏色字串
     - parameter alpha: 透明度
     
     - returns: 轉換後的顏色
     */
    class func ColorHexWithAlpha(hex: String, alpha: CGFloat) -> UIColor {
        return proceesHex(hex: hex, alpha: alpha)
    }
}

// MARK: - 主要邏輯
private func proceesHex(hex: String, alpha: CGFloat) -> UIColor{
    /** 如果傳入的字串為空 */
    if hex.isEmpty {
        return UIColor.clear
    }
    
    
    /**
        結合swift3.0 語法,修改後的邏輯實現
     */
    
    
    /** 傳進來的值。 去掉了可能包含的空格、特殊字元, 並且全部轉換為大寫 */
    let set = CharacterSet.whitespacesAndNewlines
    var hHex = hex.trimmingCharacters(in: set).uppercased()
    
    /** 如果處理過後的字串少於6位 */
    if hHex.characters.count < 6 {
        return UIColor.clear
    }
    
    /** 開頭是用0x開始的 */
    if hHex.hasPrefix("0X") {
        hHex = (hHex as NSString).substring(from: 2)
    }
    /** 開頭是以#開頭的 */
    if hHex.hasPrefix("#") {
        hHex = (hHex as NSString).substring(from: 1)
    }
    /** 開頭是以##開始的 */
    if hHex.hasPrefix("##") {
        hHex = (hHex as NSString).substring(from: 2)
    }
    
    /** 擷取出來的有效長度是6位, 所以不是6位的直接返回 */
    if hHex.characters.count != 6 {
        return UIColor.clear
    }

    /** R G B */
    var range = NSMakeRange(0, 2)
    
    /** R */
    let rHex = (hHex as NSString).substring(with: range)
    
    /** G */
    range.location = 2
    let gHex = (hHex as NSString).substring(with: range)
    
    /** B */
    range.location = 4
    let bHex = (hHex as NSString).substring(with: range)

    /** 型別轉換 */
    var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
    
    Scanner(string: rHex).scanHexInt32(&r)
    Scanner(string: gHex).scanHexInt32(&g)
    Scanner(string: bHex).scanHexInt32(&b)

    return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: alpha)
}
使用方法同理:
view.backgroundColor = UIColor.ColorHex(hex: "#f39723")
view.backgroundColor = UIColor.ColorHexWithAlpha(hex: "#f39723", alpha: 0.7)

相關文章