LoginSignup
6
6

More than 5 years have passed since last update.

UIColor拡張いろいろ

Last updated at Posted at 2016-08-07

UIColorの拡張を色々作ったので投稿。

下に解説あります。

まずどこでもいいので以下コピペしてください

ex.swift
//=============================================
//RM
extension UIColor {
    var is_dark:Bool{
        get{
            var ans = true
            let v = max(r*0.9, g*0.8, b*0.4)
            if v>0.5 {
                ans = false
            }
            return ans
        }
    }
    var hexColor: UInt32 {
        let colorSpace = CGColorGetColorSpace(self.CGColor)
        let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
        if colorSpaceModel.rawValue == 1 {
            let x = CGColorGetComponents(self.CGColor)
            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 hex = UInt32(r >> 4 + g >> 2 + b)
            return hex
        }else{
            return 0
        }
    }
    func setAlpha(alpha: CGFloat)->UIColor{
        return UIColor(red: r, green: g, blue: b, alpha: alpha)
    }
    var r:CGFloat{
        let colorSpace = CGColorGetColorSpace(self.CGColor)
        let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
        if colorSpaceModel.rawValue == 1 {
            let x = CGColorGetComponents(self.CGColor)
            return x[0]
        }else{
            return 0
        }
    }
    var g:CGFloat{
        let colorSpace = CGColorGetColorSpace(self.CGColor)
        let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
        if colorSpaceModel.rawValue == 1 {
            let x = CGColorGetComponents(self.CGColor)
            return x[1]
        }else{
            return 0
        }
    }
    var b:CGFloat{
        let colorSpace = CGColorGetColorSpace(self.CGColor)
        let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
        if colorSpaceModel.rawValue == 1 {
            let x = CGColorGetComponents(self.CGColor)
            return x[2]
        }else{
            return 0
        }
    }
    var a:CGFloat{
        let colorSpace = CGColorGetColorSpace(self.CGColor)
        let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
        if colorSpaceModel.rawValue == 1 {
            let x = CGColorGetComponents(self.CGColor)
            return x[3]
        }else{
            return 0
        }
    }
    class func hex (hex : UInt32, alpha : CGFloat) -> UIColor {
        let hexStr = String(hex, radix: 16)
        let scanner = NSScanner(string: hexStr as String)
        var color: UInt32 = 0
        if scanner.scanHexInt(&color) {
            let r = CGFloat((color & 0xFF0000) >> 16) / 255.0
            let g = CGFloat((color & 0x00FF00) >> 8) / 255.0
            let b = CGFloat(color & 0x0000FF) / 255.0
            return UIColor(red:r,green:g,blue:b,alpha:alpha)
        }else{
            return UIColor(white: 1, alpha: alpha)
        }
    }
    class func hexStr (hexStr : NSString, alpha : CGFloat) -> UIColor {
        var color = UIColor()
        switch hexStr {
        case "0":
            color = UIColor(red: 0, green: 0, blue: 0, alpha: alpha)
        case "1":
            color = UIColor(red: 1, green: 1, blue: 1, alpha: alpha)
        case "r":
            color = UIColor(red: 1, green: 0, blue: 0, alpha: alpha)
        case "g":
            color = UIColor(red: 0, green: 1, blue: 0, alpha: alpha)
        case "b":
            color = UIColor(red: 0, green: 0, blue: 1, alpha: alpha)
        default:
            let hexStr = hexStr.stringByReplacingOccurrencesOfString("#", withString: "")
            let scanner = NSScanner(string: hexStr as String)
            var colorNum: UInt32 = 0
            if scanner.scanHexInt(&colorNum) {
                let r = CGFloat((colorNum & 0xFF0000) >> 16) / 255.0
                let g = CGFloat((colorNum & 0x00FF00) >> 8) / 255.0
                let b = CGFloat(colorNum & 0x0000FF) / 255.0
                color = UIColor(red:r,green:g,blue:b,alpha:alpha)
            }else{
                color = UIColor(white: 1, alpha: alpha)
            }
        }
        return color
    }
}

is_dark

プロパティです
UIColorが暗いかどうか、上に置くアイコンの色の決定とか
本当なら色の明度を直接取るべきなんでしょうが、原色の持つ明度を考えると
[r*0.9, g*0.8, b*0.4]となるんです。
まあここら辺は自分の感性で合わせてください。

let color = UIColor.redColor()
if color.is_dark {
     //暗かったとき
}else{
    //明るかったとき
}

setAlpha

メソッドです
UIColorのAlphaだけ変更します。
仕様上、extensionから自身に代入はできないのでコードの方で代入してあげてください。

var color = UIColor.redColor()
color = color.setAlpha(0.5)

hexColor

プロパティです
UIColorのHex値です。でも使うのはお勧めしません。
(16進の処理がめんどくさい)

//めんどい、飛ばす

r、g、b、a

プロパティです。
それぞれUIColorのRed、Green、Blue、Alphaに対応します。
0から1までで返ってきます。お好みで255かけてHexにしてください。
(以外と0〜1出力の方が使いやすい場面もある)

let color = UIColor.redColor()
print(color.r)    //1.0
print(color.g)    //0.0
print(color.b)    //0.0
print(color.a)    //1.0

hex

クラスメソッドです。
Hexから色を作成します。

let red = UIColor.hex(0xff0000, alpha:1)//赤

hexStr

クラスメソッドです。
Hex文字列から色を作成します。
文字列先頭の#はあってもなくてもOKです。

let green = UIColor.hexStr("00ff00", alpha:1)//緑
ler blue = UIColor.hexStr("#0000ff", alpha:1)//青

おまけ

hexStr("0", alpha : 1)
のとき黒
hexStr("1", alpha : 1)
のとき白
hexStr("r", alpha : 1)
のとき赤
hexStr("g", alpha : 1)
のとき緑
hexStr("b", alpha : 1)
のとき青

が返ってきます。

その他自分のよく使う色、アプリのテーマカラーなどを追加しておくといいかも
自分は
hexStr("mainColor", alpha : 1)
のときアプリのテーマカラー
hexStr("TextColor", alpha : 1)
のとき文字の色

とかやってます

RM

swiftのextensionの変数は値を持てないから、
できることは限られるけど標準クラス拡張はあまりに便利

6
6
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
6
6