从一个UIColor手动颜色渐变到另一个

我试图在drawRect淡入一个UIColor到另一个UIColor 。 我创build了这个函数来计算一定比例的颜色:

 - (UIColor *)colorFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor percent:(float)percent { float dec = percent / 100.f; CGFloat fRed, fBlue, fGreen, fAlpha; CGFloat tRed, tBlue, tGreen, tAlpha; CGFloat red, green, blue, alpha; if(CGColorGetNumberOfComponents(fromColor.CGColor) == 2) { [fromColor getWhite:&fRed alpha:&fAlpha]; fGreen = fRed; fBlue = fRed; } else { [fromColor getRed:&fRed green:&fGreen blue:&fBlue alpha:&fAlpha]; } if(CGColorGetNumberOfComponents(toColor.CGColor) == 2) { [toColor getWhite:&tRed alpha:&tAlpha]; tGreen = tRed; tBlue = tRed; } else { [toColor getRed:&tRed green:&tGreen blue:&tBlue alpha:&tAlpha]; } red = (dec * (tRed - fRed)) + fRed; blue = (dec * (tGreen - fGreen)) + fGreen; green = (dec * (tBlue - fBlue)) + fBlue; alpha = (dec * (tAlpha - fAlpha)) + fAlpha; return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } 

这是做每个R / G / B / A值,并增加它取决于百分比。

这种工作,但不会[UIColor redColor]正确地淡入[UIColor purpleColor] 。 在0.1%,它显示为绿色,而不是紫色,所以它似乎从绿色褪色而不是紫色到红色。

任何人都知道我在做什么错了? 这是计算这个错误的方法吗? 有没有更准确的方法来做到这一点?

你已经把最后几行的绿色和蓝色交换了。

swift的更新版本

 import UIKit extension UIColor { // MARK: - UIColor+Percentage class func colorForProgress(progress:CGFloat) -> UIColor { var normalizedProgress = progress < 0 ? 0 : progress normalizedProgress = normalizedProgress > 1 ? 1 : normalizedProgress let R:CGFloat = 155.0 * normalizedProgress let G:CGFloat = 155.0 * (1 - normalizedProgress) let B:CGFloat = 0.0 return UIColor(red: R / 255.0, green: G / 255.0, blue: B / 255.0, alpha: 1) } class func transitionColor(fromColor:UIColor, toColor:UIColor, progress:CGFloat) -> UIColor { var percentage = progress < 0 ? 0 : progress percentage = percentage > 1 ? 1 : percentage var fRed:CGFloat = 0 var fBlue:CGFloat = 0 var fGreen:CGFloat = 0 var fAlpha:CGFloat = 0 var tRed:CGFloat = 0 var tBlue:CGFloat = 0 var tGreen:CGFloat = 0 var tAlpha:CGFloat = 0 fromColor.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) toColor.getRed(&tRed, green: &tGreen, blue: &tBlue, alpha: &tAlpha) let red:CGFloat = (percentage * (tRed - fRed)) + fRed; let green:CGFloat = (percentage * (tGreen - fGreen)) + fGreen; let blue:CGFloat = (percentage * (tBlue - fBlue)) + fBlue; let alpha:CGFloat = (percentage * (tAlpha - fAlpha)) + fAlpha; return UIColor(red: red, green: green, blue: blue, alpha: alpha) } }