LoginSignup
10
7

More than 5 years have passed since last update.

Swift3.0での16進数色指定(#FFFなど)でのUIColor生成

Last updated at Posted at 2016-08-11

初投稿です。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での文字列操作は煩雑だが慣れるしかなさそう。

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7