Last active
May 29, 2017 12:22
-
-
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
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
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