Help us understand the problem. What is going on with this article?

UIColor拡張いろいろ

More than 3 years have passed since last update.

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の変数は値を持てないから、
できることは限られるけど標準クラス拡張はあまりに便利

ObuchiYuki
未踏2020/アプリ甲子園優勝/U22プロコン経済産業省商務局長賞/セキュキャンアワード /seccamp19/未踏2020/香港→開成→mast19
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away