2013-04-02 14 views
7

Sto provando a svanire uno UIColor in un altro in un drawRect. Ho creato questa funzione per calcolare un colore ad una certa percentuale:Dissolvenza colore da un UIColor a un altro

- (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]; 
} 

Quello che fa è introiti ogni// B/Un valore G R e lo incrementa a seconda della percentuale.

Funziona, ma non svanisce correttamente [UIColor purpleColor] a [UIColor redColor]. A 0,1 percento si presenta come un colore verde piuttosto che viola, quindi sembra sfumare dal verde al rosso invece che dal viola al rosso.

Qualcuno sa cosa sto facendo male? È questo l'approccio sbagliato per calcolare questo? C'è un modo più accurato per farlo?

risposta

4

Hai il verde e il blu scambiati sulle ultime righe.

+0

Oh mio! Così tanti rossi, verdi e blu ... pensavo di averli fatti tutti! Grazie! – Luke

+0

Nessun problema. A volte hai solo bisogno di un paio di occhi in più. –

1

versione aggiornata per rapida

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) 
    } 
}