2013-04-02 22 views
7

Ich versuche einen UIColor zu einem anderen in einem drawRect zu verblassen. Ich habe diese Funktion erstellt eine Farbe bei einem bestimmten Prozentsatz zu berechnen:Manuelles Farbverblassen von einem UIColor zum anderen

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

Was das bedeutet ist, nimmt jede R/G/B/A-Wert und erhöht sich auf dem Prozentsatz abhängig.

Es funktioniert, aber nicht verblassen [UIColor purpleColor] zu [UIColor redColor] korrekt. Bei 0,1 Prozent erscheint es eher als eine grüne Farbe als lila, so dass es von grün zu rot statt von violett zu rot zu verblassen scheint.

Wer weiß, was ich falsch mache? Ist das der falsche Ansatz, um das zu berechnen? Gibt es einen genaueren Weg, dies zu tun?

Antwort

4

Sie haben Ihr Grün und Blau in den letzten paar Zeilen ausgetauscht.

+0

Oh my! So viele Rot-, Grün- und Blautöne ... Ich dachte, ich hätte sie alle gerade! Vielen Dank! – Luke

+0

Kein Problem. Manchmal braucht man nur ein zusätzliches Augenpaar. –

1

Aktualisierte Version für eine schnelle

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