2015-02-24 31 views
6

我想出了以下解決方案,但想知道是否有人給它一個更簡潔的方法(在Xcode-遊樂場測試吧):什麼是在Swift中將UIColor轉換爲十六進制(網絡顏色)的最佳/最簡單的方法?

let colors = CGColorGetComponents(UIColor.greenColor().CGColor) 
let hexCol:String = NSString(format: "#%02x%02x%02x", Int(colors[0] * 255.0), Int(colors[1] * 255.0), Int(colors[2] * 255.0)) 

resulting in #00ff00

其中UIColor.greenColor()是任何UIColor的例子。

編輯: 來自萊昂納多的答案,我覺得像重構一點(他的所有測試仍然適用)。

extension UIColor { 
    typealias RGBComponents = (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) 
    typealias HSBComponents = (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) 

    var rgbComponents:RGBComponents { 
     var c:RGBComponents = (0,0,0,0) 

     if getRed(&c.red, green: &c.green, blue: &c.blue, alpha: &c.alpha) { 
      return c 
     } 

     return (0,0,0,0) 
    } 

    var cssRGBA:String { 
     return String(format: "rgba(%d,%d,%d, %.02f)", Int(rgbComponents.red * 255), Int(rgbComponents.green * 255), Int(rgbComponents.blue * 255), Float(rgbComponents.alpha)) 
    } 
    var hexRGB:String { 
     return String(format: "#%02x%02x%02x", Int(rgbComponents.red * 255), Int(rgbComponents.green * 255), Int(rgbComponents.blue * 255)) 
    } 
    var hexRGBA:String { 
     return String(format: "#%02x%02x%02x%02x", Int(rgbComponents.red * 255), Int(rgbComponents.green * 255), Int(rgbComponents.blue * 255), Int(rgbComponents.alpha * 255)) 
    } 

    var hsbComponents:HSBComponents { 
     var c:HSBComponents = (0,0,0,0) 

     if getHue(&c.hue, saturation: &c.saturation, brightness: &c.brightness, alpha: &c.alpha) { 
      return c 
     } 

     return (0,0,0,0) 
    } 
} 

let v1 = UIColor.redColor().rgbComponents.red 
let v2 = UIColor.redColor().cssRGBA 
let v3 = UIColor.redColor().hexRGBA 
let v4test = UIColor.RGBComponents(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0) 
+1

可能重複的[如何的UIColor轉換爲十六進制和顯示的NSLog](http://stackoverflow.com/questions/26341008/how-to-convert-uicolor-to-hex-and-display-in-nslog) – Fogmeister 2015-02-24 13:22:21

+0

在該線程中給出的答案(其中,順便提一下,在Object中給出ive-C)與此問題中的代碼具有相同的問題:CGColorGetComponents()不一定返回RGBA組件的數組。對於灰度顏色,它返回一個只有一個灰色分量的數組(並且代碼崩潰)。 – 2015-02-24 13:38:49

+0

@LeonardoSavioDabus:如果已從模式圖像創建UIColor,則* *認爲'getRed(_:green:blue:alpha:)'失敗。如果使用其他顏色空間(例如CMYK)從CIColor創建UIColor,則它*可能會失敗。我沒有測試它。 – 2015-02-24 13:59:33

回答

13

的Xcode 8.2•斯威夫特3.0.2

獲得紅,綠,藍和Alpha從的UIColor組件:

extension UIColor { 
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { 
     var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 
     if getRed(&r, green: &g, blue: &b, alpha: &a) { 
      return (r,g,b,a) 
     } 
     return (0, 0, 0, 0) 
    } 

    // hue, saturation, brightness and alpha components from UIColor** 
    var hsba: (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) { 
     var hue: CGFloat = 0, saturation: CGFloat = 0, brightness: CGFloat = 0, alpha: CGFloat = 0 
     if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) { 
      return (hue, saturation, brightness, alpha) 
     } 
     return (0,0,0,0) 
    } 

    var htmlRGB: String { 
     return String(format: "#%02x%02x%02x", Int(rgba.red * 255), Int(rgba.green * 255), Int(rgba.blue * 255)) 
    } 

    var htmlRGBA: String { 
     return String(format: "#%02x%02x%02x%02x", Int(rgba.red * 255), Int(rgba.green * 255), Int(rgba.blue * 255), Int(rgba.alpha * 255)) 
    } 
} 

測試它:

HTML顏色

let myWhiteWebColor = UIColor(red: 1, green: 1, blue: 1, alpha: 1).htmlRGBA  // #ffffffff 
let myGreyWebColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1).htmlRGBA // #7f7f7fff 
let myBlackWebColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1).htmlRGBA  // #000000ff 
let myRedWebColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1).htmlRGBA  // #ff0000ff 
let myGreenWebColor = UIColor(red: 0, green: 1, blue: 0, alpha: 1).htmlRGBA  // #00ff00ff 
let myBlueWebColor = UIColor(red: 0, green: 0, blue: 1, alpha: 1).htmlRGBA  // #0000ffff 

let myColorBlack = UIColor.black.htmlRGBA    // #000000ff 
let myLghtGrayColor = UIColor.lightGray.htmlRGBA  // #aaaaaaff 
let myDarkGrayColor = UIColor.darkGray.htmlRGBA  // #555555ff 

let myRedHueWebColor = UIColor(hue: 1, saturation: 1, brightness: 1, alpha: 1).htmlRGBA //ff0000ff 

RGB分量

UIColor.red.rgba  // (1.0, 0.0, 0.0, 1.0) 
UIColor.red.rgba.red // 1 
UIColor.red.rgba.green // 0 
UIColor.red.rgba.blue // 0 
UIColor.red.rgba.alpha // 1 

UIColor.green.rgba  // (0.0, 1.0, 0.0, 1.0) 
UIColor.green.rgba.red // 0 
UIColor.green.rgba.green // 1 
UIColor.green.rgba.blue // 0 
UIColor.green.rgba.alpha // 1 

UIColor.blue.rgba  // (0.0, 0.0, 1.0, 1.0) 
UIColor.blue.rgba.red // 0 
UIColor.blue.rgba.green // 0 
UIColor.blue.rgba.blue // 1 
UIColor.blue.rgba.alpha // 1 

色調成分

UIColor.red.hsba    // (0.0, 1.0, 1.0, 1.0) 
UIColor.red.hsba.hue   // 1 
UIColor.red.hsba.saturation // 1 
UIColor.red.hsba.brightness // 1 
UIColor.red.hsba.alpha   // 1 

UIColor.green.hsba    // (0.333333333333333, 1.0, 1.0, 1.0) 
UIColor.green.hsba.hue   // 0.3333333333333333 
UIColor.green.hsba.saturation // 1 
UIColor.green.hsba.brightness // 1 
UIColor.green.hsba.alpha  // 1 

UIColor.blue.hsba    // (0.666666666666667, 1.0, 1.0, 1.0) 
UIColor.blue.hsba.hue   // 0.666666666666667 
UIColor.blue.hsba.saturation // 1.0 
UIColor.blue.hsba.brightness // 1.0 
UIColor.blue.hsba.alpha  // 1.0 

UIColor.clear.hsba  // (.0 0, .1 0, .2 0, .3 0) 

UIColor.blue.htmlRGB  //"#0000ff" 
UIColor.blue.htmlRGBA //"#0000ffff" 
+1

我同意getRed(_:green:blue:alpha:)比CGColorGetComponents()更好。但請注意,此方法返回一個布爾值,可能會失敗。 - 建議:使用'String(格式:「#%02x%02x%02x」,...)'而不是* 2 *自定義擴展名來進行格式化。 – 2015-02-24 13:53:28

+0

@Martin R我也可以使用getHue,但它已經與使用色調輸入 – 2015-02-24 14:07:43

+0

生成的UIColors一起使用,它可以與「其他顏色空間」一起工作嗎? – BananaAcid 2015-02-24 14:08:25

相關問題