初投稿です。Swift3の名前規則が安定してきたので、本格的にiOSとSwiftでの開発を始めました。今回はAndroidやCSSでよく使う16進数色指定をUIColorで使えるようにします。
Xcode8 beta5で動作確認しています。
##文字列を数値に変換するコード
まずは16進数文字列を数値に変換します。
var numstr = "FFFFFF" // "FFFFFF"
var num = Int(numstr, radix: 16) ?? 0 // 16777215
なお、数値を16進数文字列に変換する時はこう。
var strnum = 255 // 255
var str = String(strnum, radix: 16) // "ff"
システムではFは小文字を使うようなので、プログラムは小文字で統一します。
##UIColorを拡張する
UIColorを生成時に色を指定するので、Initializerとして定義します。
extension UIColor {
convenience init(hex32: UInt32) {
let alpha = CGFloat((hex32 >> 24) & 0xff) / 0xff
let red = CGFloat((hex32 >> 16) & 0xff) / 0xff
let green = CGFloat((hex32 >> 8) & 0xff) / 0xff
let blue = CGFloat(hex32 & 0xff) / 0xff
self.init(red: red, green: green, blue: blue, alpha: alpha)
}
}
UIColor(hex32: 0xff888888) // r 0.533 g 0.533 b 0.533 a 1.0
これに、0xFFFなど指定用のInitializerも追加して、16進数文字列のInitializerから呼び出すようにすれば完成。
extension UIColor {
convenience init(hex16: UInt16) {
let alpha = CGFloat((hex16 >> 12) & 0xf) / 0xf
let red = CGFloat((hex16 >> 8) & 0xf) / 0xf
let green = CGFloat((hex16 >> 4) & 0xf) / 0xf
let blue = CGFloat(hex16 & 0xf) / 0xf
self.init(red: red, green: green, blue: blue, alpha: alpha)
}
convenience init(hex32: UInt32) {
let alpha = CGFloat((hex32 >> 24) & 0xff) / 0xff
let red = CGFloat((hex32 >> 16) & 0xff) / 0xff
let green = CGFloat((hex32 >> 8) & 0xff) / 0xff
let blue = CGFloat(hex32 & 0xff) / 0xff
self.init(red: red, green: green, blue: blue, alpha: alpha)
}
convenience init?(hexString: String) {
if !hexString.hasPrefix("#") {
return nil
}
var hexStr = hexString
hexStr.remove(at: hexStr.startIndex)
switch hexStr.characters.count {
case 3:
hexStr = "f" + hexStr
fallthrough
case 4:
guard let hex16 = UInt16(hexStr, radix: 16) else {
return nil
}
self.init(hex16: hex16)
case 6:
hexStr = "ff" + hexStr
fallthrough
case 8:
guard let hex32 = UInt32(hexStr, radix: 16) else {
return nil
}
self.init(hex32: hex32)
default:
return nil
}
}
}
UIColor(hex16: 0xf888) // r 0.533 g 0.533 b 0.533 a 1.0
UIColor(hexString: "#888888") // r 0.533 g 0.533 b 0.533 a 1.0
UIColor(hexString: "#333") // r 0.2 g 0.2 b 0.2 a 1.0
3桁4桁6桁8桁の16進数色指定に対応。
hex16やhex32を使わないならprivateに設定してください。
swift3での文字列操作は煩雑だが慣れるしかなさそう。