2013-04-02 6 views
7

にあるUIColorを別のものにフェードインしようとしています。あるUIColorから別の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を取得し、割合に応じてそれをインクリメントんどの:私は一定の割合で色を計算するためにこの関数を作成しました。

これはうまく機能しますが、[UIColor purpleColor][UIColor redColor]が正しく消えません。 0.1パーセントでは紫色ではなく緑色で表示されるため、紫色から赤色ではなく緑色から赤色に色あせて表示されます。

誰かが間違っていることを知っていますか?これを計算するのは間違ったアプローチですか?これを行うより正確な方法はありますか?

答えて

4

最後の数行で緑色と青色を入れ替えました。

+0

のバージョンを更新しました!非常に多くの赤、緑、青が...私はそれらがまっすぐにあると思った!ありがとう! – Luke

+0

問題ありません。時には余分な目が必要になることもあります。 –

1

は私のああ迅速

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) 
    } 
} 
関連する問題