Created
November 15, 2014 00:13
-
-
Save gurgeous/db73ad277841d2bd3887 to your computer and use it in GitHub Desktop.
UIColor enhancements
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension UIColor { | |
// | |
// MARK: create with hex string | |
// | |
convenience init(string: String) { | |
// strip leading pound | |
let s = string.stringByReplacingOccurrencesOfString("#", withString: "") | |
var r = UInt32(0) | |
var g = UInt32(0) | |
var b = UInt32(0) | |
var a = UInt32(0xff) | |
var value = UInt32(0) | |
NSScanner(string: s).scanHexInt(&value) | |
switch s.length { | |
case 2: | |
r = value | |
g = value | |
b = value | |
case 3: | |
// RGB | |
r = (value & 0xf00) >> 8 | |
g = (value & 0x0f0) >> 4 | |
b = (value & 0x00f) >> 0 | |
r += r * 16 | |
g += g * 16 | |
b += b * 16 | |
case 6: | |
// RRGGBB | |
r = (value & 0xff0000) >> 16 | |
g = (value & 0x00ff00) >> 8 | |
b = (value & 0x0000ff) >> 0 | |
default: | |
// RRGGBBAA | |
r = (value & 0xff000000) >> 24 | |
g = (value & 0x00ff0000) >> 16 | |
b = (value & 0x0000ff00) >> 8 | |
a = (value & 0x000000ff) >> 0 | |
} | |
self.init(red: CGFloat(r) / CGFloat(255), green: CGFloat(g) / CGFloat(255), blue: CGFloat(b) / CGFloat(255), alpha: CGFloat(a) / CGFloat(255)) | |
} | |
// | |
// MARK: components | |
// | |
var hue: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getHue(&value, saturation: nil, brightness: nil, alpha: nil) | |
return value | |
} | |
} | |
var saturation: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getHue(nil, saturation: &value, brightness: nil, alpha: nil) | |
return value | |
} | |
} | |
var brightness: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getHue(nil, saturation: nil, brightness: &value, alpha: nil) | |
return value | |
} | |
} | |
var red: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getRed(&value, green: nil, blue: nil, alpha: nil) | |
return value | |
} | |
} | |
var green: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getRed(nil, green: &value, blue: nil, alpha: nil) | |
return value | |
} | |
} | |
var blue: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getRed(nil, green: nil, blue: &value, alpha: nil) | |
return value | |
} | |
} | |
var alpha: CGFloat { | |
get { | |
var value = CGFloat(0) | |
getRed(nil, green: nil, blue: nil, alpha: &value) | |
return value | |
} | |
} | |
// | |
// MARK: HSB | |
// | |
/* | |
func lighten(percent: CGFloat) -> UIColor { | |
return offsetHSB(brightness: percent) | |
} | |
func darken(percent: CGFloat) -> UIColor { | |
return offsetHSB(brightness: -percent) | |
} | |
*/ | |
func offset(hue: CGFloat = 0, saturation: CGFloat = 0, brightness: CGFloat = 0, alpha: CGFloat = 0) -> UIColor { | |
var h = CGFloat(0), s = CGFloat(0), b = CGFloat(0), a = CGFloat(0) | |
getHue(&h, saturation: &s, brightness: &b, alpha: &a) | |
func clamp(x: CGFloat) -> CGFloat { | |
return min(max(x, CGFloat(0)), CGFloat(1)) | |
} | |
h = (h + hue) % CGFloat(1) | |
s = clamp(s + saturation) | |
b = clamp(b + brightness) | |
a = clamp(a + alpha) | |
return UIColor(hue: h, saturation: s, brightness: b, alpha: a) | |
} | |
// | |
// MARK: with | |
// | |
func with(#red: CGFloat) -> UIColor { | |
var ignore = CGFloat(0), green = CGFloat(0), blue = CGFloat(0), alpha = CGFloat(0) | |
getRed(&ignore, green: &green, blue: &blue, alpha: &alpha) | |
return UIColor(red: red, green: green, blue: blue, alpha: alpha) | |
} | |
func with(#green: CGFloat) -> UIColor { | |
var red = CGFloat(0), ignore = CGFloat(0), blue = CGFloat(0), alpha = CGFloat(0) | |
getRed(&red, green: &ignore, blue: &blue, alpha: &alpha) | |
return UIColor(red: red, green: green, blue: blue, alpha: alpha) | |
} | |
func with(#blue: CGFloat) -> UIColor { | |
var red = CGFloat(0), green = CGFloat(0), ignore = CGFloat(0), alpha = CGFloat(0) | |
getRed(&red, green: &green, blue: &ignore, alpha: &alpha) | |
return UIColor(red: red, green: green, blue: blue, alpha: alpha) | |
} | |
func with(#alpha: CGFloat) -> UIColor { | |
var red = CGFloat(0), green = CGFloat(0), blue = CGFloat(0), ignore = CGFloat(0) | |
getRed(&red, green: &green, blue: &blue, alpha: &ignore) | |
return UIColor(red: red, green: green, blue: blue, alpha: alpha) | |
} | |
func with(#hue: CGFloat) -> UIColor { | |
var ignore = CGFloat(0), saturation = CGFloat(0), brightness = CGFloat(0), alpha = CGFloat(0) | |
getHue(&ignore, saturation: &saturation, brightness: &brightness, alpha: &alpha) | |
return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha) | |
} | |
func with(#saturation: CGFloat) -> UIColor { | |
var hue = CGFloat(0), ignore = CGFloat(0), brightness = CGFloat(0), alpha = CGFloat(0) | |
getHue(&hue, saturation: &ignore, brightness: &brightness, alpha: &alpha) | |
return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha) | |
} | |
func with(#brightness: CGFloat) -> UIColor { | |
var hue = CGFloat(0), saturation = CGFloat(0), ignore = CGFloat(0), alpha = CGFloat(0) | |
getHue(&hue, saturation: &saturation, brightness: &ignore, alpha: &alpha) | |
return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha) | |
} | |
// | |
// MARK: other accessors | |
// | |
var rgb: UInt32 { | |
get { | |
var red = CGFloat(0) | |
var green = CGFloat(0) | |
var blue = CGFloat(0) | |
getRed(&red, green: &green, blue: &blue, alpha: nil) | |
let r = UInt32(red * CGFloat(255.0)) | |
let g = UInt32(green * CGFloat(255.0)) | |
let b = UInt32(blue * CGFloat(255.0)) | |
return (r << 16) + (g << 8) + b | |
} | |
} | |
var rgba: UInt32 { | |
get { | |
var red = CGFloat(0) | |
var green = CGFloat(0) | |
var blue = CGFloat(0) | |
var alpha = CGFloat(0) | |
getRed(&red, green: &green, blue: &blue, alpha: &alpha) | |
let r = UInt32(red * CGFloat(255.0)) | |
let g = UInt32(green * CGFloat(255.0)) | |
let b = UInt32(blue * CGFloat(255.0)) | |
let a = UInt32(alpha * CGFloat(255.0)) | |
return (r << 24) + (g << 16) + (b << 8) + a | |
} | |
} | |
var string: String { | |
get { | |
if alpha != CGFloat(1) { | |
return NSString(format: "#%08x", rgba) | |
} | |
return NSString(format: "#%06x", rgb) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment