文字っぽいの。

文字を書いています。写真も混ざります。

爆速でiOSアプリのカラー設定をするための`extension`と`enum`

アプリを爆速で作りたい時に、最も時間を浪費するのが色の指定です。StoryBoard上で設定してしまうと、あとから調整をしたい場合、複数ある画面全てを渡り歩いて、丁寧な手作業で色をポチポチしていく必要があります。また、UIColorを使う場合でも、設定があちこちに分散してしまったり、RGB[0 - 255]での設定が難しくてつらい気持ちになったりします。

なので、Webで一般的な16進数表記でUIColorを生成できるようにして、生成したい色のセットをenumで管理するようにしました。

色を指定する際は、16進数で書けたほうが便利なのですが、UIColorは16進数表記でイニシャライズさせてくれません。ので、拡張します。

// 16進数表記からUIColorに変換する拡張
extension UIColor {
    convenience init?(hexString: String, alpha: CGFloat = 1.0) {
        let validatedHexColorCode = hexString.stringByReplacingOccurrencesOfString("#", withString: "")
        let scanner = NSScanner(string: validatedHexColorCode)
        var colorCode: UInt32 = 0

        guard scanner.scanHexInt(&colorCode) else {
            print("ERROR: 色変換に失敗しました。")
            return nil
        }

        let R = CGFloat((colorCode & 0xFF0000) >> 16) / 255.0
        let G = CGFloat((colorCode & 0x00FF00) >> 8) / 255.0
        let B = CGFloat(colorCode & 0x0000FF) / 255.0
        self.init(red: R, green: G, blue: B, alpha: alpha)
    }
}

これで UIColor(hexString: "#ffffff")インスタンスを生成することが出来ます。ちなみに、ここの処理は最初は関数になっていたのですが、最強のアルバイト氏が書きなおしてくれました。convenienceってこうやって使うんかって知った。さすが最強。

次にいくつかの16進数カラーコードを、enumで管理します。

// 色設定
enum ColorSet: String {
    case Background   = "F9F5EF"
    case Primary      = "2E97D8"
    case White        = "FFFFFF"
    case Gray         = "D0CAC1"

    var UIColor: UIKit.UIColor {
        return UIKit.UIColor(hexString: self.rawValue)!
    }

    var CGColor: UIKit.CGColor {
        return self.UIColor.CGColor
    }
}

こんな感じで定義しておけばColorSet.Primary.UIColorと呼び出すことができて大変便利です。また、急に「寒色系じゃなくて暖色系の色合いがいい」と言われた場合でも、このColorSetをいじるだけでアプリ全体の色を調整する事が可能になっています。またこれにより、Web側やSketch等各種デザインツールで設定されたカラーコードを、簡単に反映する事ができるようになりました。