UIColor transition based on progress value
The swift version provided above doesn't work with the white color, here the solution:
struct ColorComponents {
var r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat
}
extension UIColor {
func getComponents() -> ColorComponents {
if (cgColor.numberOfComponents == 2) {
let cc = cgColor.components!
return ColorComponents(r:cc[0], g:cc[0], b:cc[0], a:cc[1])
}
else {
let cc = cgColor.components!
return ColorComponents(r:cc[0], g:cc[1], b:cc[2], a:cc[3])
}
}
func interpolateRGBColorTo(end: UIColor, fraction: CGFloat) -> UIColor {
var f = max(0, fraction)
f = min(1, fraction)
let c1 = self.getComponents()
let c2 = end.getComponents()
let r = c1.r + (c2.r - c1.r) * f
let g = c1.g + (c2.g - c1.g) * f
let b = c1.b + (c2.b - c1.b) * f
let a = c1.a + (c2.a - c1.a) * f
return UIColor.init(red: r, green: g, blue: b, alpha: a)
}
}
let color1 = UIColor.whiteColor()
let color2 = UIColor(red: 0.933, green: 0.794, blue: 0.000, alpha: 1.00)
color1.interpolateRGBColorTo(color2, fraction:0.1)
color1.interpolateRGBColorTo(color2, fraction:0.2)
color1.interpolateRGBColorTo(color2, fraction:0.3)
Swift version converted from the code from Jonathan Ellis
extension UIColor {
func interpolateRGBColorTo(_ end: UIColor, fraction: CGFloat) -> UIColor? {
let f = min(max(0, fraction), 1)
guard let c1 = self.cgColor.components, let c2 = end.cgColor.components else { return nil }
let r: CGFloat = CGFloat(c1[0] + (c2[0] - c1[0]) * f)
let g: CGFloat = CGFloat(c1[1] + (c2[1] - c1[1]) * f)
let b: CGFloat = CGFloat(c1[2] + (c2[2] - c1[2]) * f)
let a: CGFloat = CGFloat(c1[3] + (c2[3] - c1[3]) * f)
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
let color1 = UIColor(red: 0.035, green: 0.216, blue: 0.933, alpha: 1.00)
let color2 = UIColor(red: 0.933, green: 0.794, blue: 0.000, alpha: 1.00)
color1.interpolateRGBColorTo(color2, fraction:0.1)
You can do a "linear interpolation" between the colors:
CGFloat newRed = (1.0 - progress) * red + progress * finalRed;
CGFloat newGreen = (1.0 - progress) * green + progress * finalGreen;
CGFloat newBlue = (1.0 - progress) * blue + progress * finalBlue;
UIColor *color = [UIColor colorWithRed:newRed green:newGreen blue:newBlue alpha:1.0];
This gives the initial color for progress == 0
and the final color for
progress == 1
.