追記: カラースペースがRGB以外であるとき、hexString・RGBaがnilを返すように変更
用法
a. 16進数からUIColorをつくる
// Intで渡すときは 0x をつける
let x = UIColor(hex: 0xC1E4E9, alpha: 1)
// Stringで渡すときは # を付けても付けなくてもよい
let y = UIColor(hexString: "#c1e4e9", alpha: 1)
b. UIColorから16進数を受け取る (CGColorでも可)
// String
x.hexString
c. UIColorからRGBaを受け取る (CGColorでも可)
// (red: Int, green: Int, blue: Int, alpha: CGFloat)
x.RGBa
本体
import UIKit
extension UIColor {
convenience init(hex: Int, alpha: CGFloat) {
let r = CGFloat((hex & 0xFF0000) >> 16) / 255.0
let g = CGFloat((hex & 0x00FF00) >> 8) / 255.0
let b = CGFloat(hex & 0x0000FF) / 255.0
self.init(red: r, green: g, blue: b, alpha: alpha)
}
convenience init(hexString str: String, alpha: CGFloat) {
let range = NSMakeRange(0, countElements(str))
let hex = (str as NSString).stringByReplacingOccurrencesOfString("[^0-9a-fA-F]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: range)
var color: UInt32 = 0
NSScanner(string: hex).scanHexInt(&color)
self.init(hex: Int(color), alpha: alpha)
}
var hexString: String? {
return self.CGColor.hexString
}
var RGBa: (red: Int, green: Int, blue: Int, alpha: CGFloat)? {
return self.CGColor.RGBa
}
}
extension CGColor {
var hexString: String? {
if let x = self.RGBa {
let hex = x.red * 0x10000 + x.green * 0x100 + x.blue
return NSString(format:"%06x", hex) as String
} else {
return nil
}
}
var RGBa: (red: Int, green: Int, blue: Int, alpha: CGFloat)? {
let colorSpace = CGColorGetColorSpace(self)
let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
if colorSpaceModel.value == 1 {
let x = CGColorGetComponents(self)
let r: Int = Int(x[0] * 255.0)
let g: Int = Int(x[1] * 255.0)
let b: Int = Int(x[2] * 255.0)
let a: CGFloat = x[3]
return (r, g, b, a)
} else {
return nil
}
}
}
動機
init
UIColor(red: 193, green: 228, blue: 233, alpha: 1)
と書けない腹いせに作りました (実際は255.0で割る)。
どうやら誰しも同じ発想に至るらしく、UIColorとHexのためのエクステンションは既にQiitaにも色々あるのですが、イニシャライザーの形式はなさそうだったので勉強がてら書きました。
StringとIntどちらも引数にできるようにした理由は特にありません。
hexString
printlnを使ってUIColorを出力するとUIDeviceRGBColorSpace 0.756863 0.894118 0.913725 1
などと表示されるのですが、残念ながら全く分かりません。これがもしc1e4e9
なら一瞬で検索して色が分かるのに… と思ったので作りました。
backgroundColor
とかbarTintColor
とかtintColor
とか、どこの色なのかよく分からないものについて力技で調べるのに使えるかもしれません。
RGBa
これは作る必要もなかったのですが、標準で用意されている取得方法が
x.getRed(<#red: UnsafeMutablePointer<CGFloat>#>,
green: <#UnsafeMutablePointer<CGFloat>#>,
blue: <#UnsafeMutablePointer<CGFloat>#>,
alpha: <#UnsafeMutablePointer<CGFloat>#>)
といういかにも使いたくない感じであるのを見つけたので、ついでに付けました。
名前付きのタプルにしたので、気楽に使えるのではないかと思います。なおRGBについてはInt型です。