UIColorの拡張を色々作ったので投稿。
下に解説あります。
まずどこでもいいので以下コピペしてください
//=============================================
//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の変数は値を持てないから、
できることは限られるけど標準クラス拡張はあまりに便利