LoginSignup
24
25

More than 5 years have passed since last update.

UIColorと16進数の相性をよくするExtension

Last updated at Posted at 2014-12-05

追記: カラースペースが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型です。

24
25
2

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
24
25