Skip to content

Instantly share code, notes, and snippets.

@shawnthroop
Last active May 29, 2017 12:22
Show Gist options
  • Save shawnthroop/89cc506be29d184f3f96cd4b36250958 to your computer and use it in GitHub Desktop.
Save shawnthroop/89cc506be29d184f3f96cd4b36250958 to your computer and use it in GitHub Desktop.
Additions to UIColor that allow for easier manipulation of RGBA and HSBA values, in Swift
import UIKit
extension UIColor {
struct HSBA {
var hue: CGFloat
var saturation: CGFloat
var brightness: CGFloat
var alpha: CGFloat
init(hue: CGFloat = 0.0, saturation: CGFloat = 0.0, brightness: CGFloat = 0.0, alpha: CGFloat = 0.0) {
self.hue = hue
self.saturation = saturation
self.brightness = brightness
self.alpha = alpha
}
init?(color: UIColor) {
var values = HSBA()
guard color.getHue(&values.hue, saturation: &values.saturation, brightness: &values.brightness, alpha: &values.alpha) else {
return nil
}
self = values
}
}
struct RGBA {
var red: CGFloat
var green: CGFloat
var blue: CGFloat
var alpha: CGFloat
init(red: CGFloat = 0.0, green: CGFloat = 0.0, blue: CGFloat = 0.0, alpha: CGFloat = 0.0) {
self.red = red
self.blue = blue
self.green = green
self.alpha = alpha
}
init?(color: UIColor) {
var values = RGBA()
guard color.getRed(&values.red, green: &values.green, blue: &values.blue, alpha: &values.alpha) else {
return nil
}
self = values
}
}
// MARK: - Public
var hsba: HSBA? {
return HSBA(color: self)
}
var rgba: RGBA? {
return RGBA(color: self)
}
// Some inspiration: https://stackoverflow.com/questions/11598043/get-slightly-lighter-and-darker-color-from-uicolor
func colorByAlteringHSBA(_ body: (inout HSBA) -> Void) -> UIColor {
guard var values = hsba else {
return self
}
body(&values)
return UIColor(hue: values.hue, saturation: values.saturation, brightness: values.brightness, alpha: values.alpha)
}
func colorByAlteringRGBA(_ body: (inout RGBA) -> Void) -> UIColor {
guard var values = rgba else {
return self
}
body(&values)
return UIColor(red: values.red, green: values.green, blue: values.blue, alpha: values.alpha)
}
// MARK: - Helpers
var lightened: UIColor {
return lighten(by: 0.3)
}
func lighten(by percent: CGFloat) -> UIColor {
return colorByAlteringHSBA { values in
values.brightness = min(values.brightness * (1.0 + percent), 1.0)
}
}
var darkened: UIColor {
return darken(by: 0.3)
}
func darken(by percent: CGFloat) -> UIColor {
return colorByAlteringHSBA { values in
values.brightness = max(values.brightness * (1.0 - percent), 0.0)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment