Skip to content

Instantly share code, notes, and snippets.

@SpacyRicochet
Created February 5, 2017 20:22
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save SpacyRicochet/1c90695fb01aeaff7d7e8c1b1d8a39ca to your computer and use it in GitHub Desktop.
Save SpacyRicochet/1c90695fb01aeaff7d7e8c1b1d8a39ca to your computer and use it in GitHub Desktop.
Snippet of the Week: Lighter and Darker Colors
import UIKit
import PlaygroundSupport
public extension UIColor {
public func hsba() -> (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat)? {
var hue: CGFloat = .nan, saturation: CGFloat = .nan, brightness: CGFloat = .nan, alpha: CGFloat = .nan
guard self.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) else {
return nil
}
return (hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
}
public func changedBrightness(byPercentage perc: CGFloat) -> UIColor? {
if perc == 0 {
return self.copy() as? UIColor
}
guard let hsba = hsba() else {
return nil
}
let percentage: CGFloat = min(max(perc, -1), 1)
let newBrightness = min(max(hsba.brightness + percentage, -1), 1)
return UIColor(hue: hsba.hue, saturation: hsba.saturation, brightness: newBrightness, alpha: hsba.alpha)
}
public func lightened(byPercentage percentage: CGFloat = 0.1) -> UIColor? {
return changedBrightness(byPercentage: percentage)
}
public func darkened(byPercentage percentage: CGFloat = 0.1) -> UIColor? {
return changedBrightness(byPercentage: -percentage)
}
public func changedSaturation(byPercentage perc: CGFloat) -> UIColor? {
if perc == 0 {
return self.copy() as? UIColor
}
guard let hsba = hsba() else {
return nil
}
let percentage: CGFloat = min(max(perc, -1), 1)
let newSaturation = min(max(hsba.saturation + percentage, -1), 1)
return UIColor(hue: hsba.hue, saturation: newSaturation, brightness: hsba.brightness, alpha: hsba.alpha)
}
public func tinted(byPercentage percentage: CGFloat = 0.1) -> UIColor? {
return changedSaturation(byPercentage: percentage)
}
public func shaded(byPercentage percentage: CGFloat = 0.1) -> UIColor? {
return changedSaturation(byPercentage: -percentage)
}
}
let stackView1 = UIStackView(frame: CGRect(x: 0, y: 0, width: 500, height: 200))
stackView1.axis = .horizontal
stackView1.distribution = .fillEqually
var views1: [UIView] = []
let color1 = UIColor.purple.darkened(byPercentage: 0.2)!
for i in 0...4 {
let subcolor = color1.lightened(byPercentage: CGFloat(i) * 0.1)
let subview = UIView(frame: CGRect(x: 1, y: 1, width: 1, height: 1))
subview.backgroundColor = subcolor
views1 += [subview]
stackView1.addArrangedSubview(subview)
}
PlaygroundPage.current.liveView = stackView1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment