Ios 手动将颜色从一种UIColor淡入另一种UIColor

Ios 手动将颜色从一种UIColor淡入另一种UIColor,ios,colors,drawrect,uicolor,cgcolor,Ios,Colors,Drawrect,Uicolor,Cgcolor,我试图在drawRect中将一个UIColor淡入另一个。我创建此函数是为了按一定百分比计算颜色: - (UIColor *)colorFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor percent:(float)percent { float dec = percent / 100.f; CGFloat fRed, fBlue, fGreen, fAlpha; CGFloat tRed, tBlue,

我试图在
drawRect
中将一个
UIColor
淡入另一个
。我创建此函数是为了按一定百分比计算颜色:

- (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 purpleColor]
褪色为
[UIColor redColor]
。在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)
    }
}
导入UIKit
扩展UIColor{
//标记:-UIColor+百分比
类func colorForProgress(progress:CGFloat)->UIColor{
var normalizedProgress=进度<0?0:进度
normalizedProgress=normalizedProgress>1?1:normalizedProgress
设R:CGFloat=155.0*normalizedProgress
设G:CGFloat=155.0*(1-标准化进度)
设B:CGFloat=0.0
返回UIColor(红色:R/255.0,绿色:G/255.0,蓝色:B/255.0,alpha:1)
}
类func transitionColor(fromColor:UIColor,toColor:UIColor,progress:CGFloat)->UIColor{
变量百分比=进度<0?0:进度
百分比=百分比>1?1:百分比
变量fRed:CGFloat=0
变量fBlue:CGFloat=0
变量fGreen:CGFloat=0
var fAlpha:CGFloat=0
变量树:CGFloat=0
变量tBlue:CGFloat=0
var tGreen:CGFloat=0
var tAlpha:CGFloat=0
getRed(&fRed,绿色:&fGreen,蓝色:&fBlue,alpha:&fAlpha)
toColor.getRed(&tRed,green:&tGreen,blue:&tBlue,alpha:&tAlpha)
让红色:CGFloat=(百分比*(tRed-fRed))+fRed;
设为绿色:CGFloat=(百分比*(tGreen-fGreen))+fGreen;
让蓝色:CGFloat=(百分比*(tBlue-fBlue))+fBlue;
设α:CGFloat=(百分比*(tAlpha-fAlpha))+fAlpha;
返回UIColor(红色:红色,绿色:绿色,蓝色:蓝色,alpha:alpha)
}
}

哦,天哪!这么多的红、绿、蓝。。。我还以为我把他们都搞定了呢!谢谢没问题。有时候你只需要多一双眼睛。