アプリを爆速で作りたい時に、最も時間を浪費するのが色の指定です。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等各種デザインツールで設定されたカラーコードを、簡単に反映する事ができるようになりました。