Skip to content

Instantly share code, notes, and snippets.

@aaronpearce
Last active August 19, 2020 01:08
Show Gist options
  • Save aaronpearce/31c87a4ec5487bc77e5316f57d748721 to your computer and use it in GitHub Desktop.
Save aaronpearce/31c87a4ec5487bc77e5316f57d748721 to your computer and use it in GitHub Desktop.
UIColor Scaling
// Based upon https://web.archive.org/web/20150227031931/http://www.codelib.net/home/jkm/hexcolorscale.html
extension UIColor {
func scaled(by factor: CGFloat) -> UIColor {
let components = self.cgColor.components
var r: CGFloat = (components?[0] ?? 0.0) * 255
var g: CGFloat = (components?[1] ?? 0.0) * 255
var b: CGFloat = (components?[2] ?? 0.0) * 255
let alpha: CGFloat = components?[3] ?? 1.0
r = round(relsizeinv(a: relsize(a: r) * factor))
g = round(relsizeinv(a: relsize(a: g) * factor))
b = round(relsizeinv(a: relsize(a: b) * factor))
return UIColor(red: r / 255, green: g / 255, blue: b / 255, alpha: alpha)
}
private static let max255: CGFloat = 255
private func relsize(a: CGFloat) -> CGFloat {
guard a != UIColor.max255 else { return UIColor.max255 }
return a / (UIColor.max255 - a)
}
private func relsizeinv(a: CGFloat) -> CGFloat {
guard a != UIColor.max255 else { return UIColor.max255 }
return UIColor.max255 * a / (1 + a)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment