Skip to content

Instantly share code, notes, and snippets.

@gurgeous
Created November 15, 2014 00:13
Show Gist options
  • Save gurgeous/db73ad277841d2bd3887 to your computer and use it in GitHub Desktop.
Save gurgeous/db73ad277841d2bd3887 to your computer and use it in GitHub Desktop.
UIColor enhancements
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