2010-01-26 90 views
2

我想知道是否有人可以建議在漸變過程中從一種顏色轉換到另一種顏色的最佳方式。UIColor/RGB從X顏色到Y顏色的方式

所以 - 我有一個文本框,我有一個文本的限制。我希望文本以白色開始,但在達到最大文本限制時爲紅色。

有沒有簡單的方法來做到這一點?我不確定從哪裏開始......

回答

1

使用HSL or HSV而不是RGB。他們有各種屬性從0到100%,所以你可以在代碼中很好地擴展它們。

這是the objective c reference

+0

在這種情況下HSL/HSV並不比RGB更有幫助。而且我不確定OP是否真的難以構建實際的UIColor。我認爲mootymoots正在尋找關於如何解決文本框情況的更大圖片的答案。 – 2010-01-26 20:49:27

+0

其實,它的顏色是我的問題 - 沒有分配給文本。我只是需要根據文本的長度,是什麼顏色值並將其設置爲文本...... – mootymoots 2010-01-26 21:00:44

+1

正確,所以這很簡單。 [性格指數]/[最大長度] = [用於HSV計算的百分比] – jvenema 2010-01-26 21:36:07

0

您需要將您的終點顏色轉換爲其中一個參數爲強度的顏色空間,以便您可以保持不變。 @ jvenema的建議是體面的。然後將其他兩個值作爲二維中的兩個點,並根據滑塊的位置在連接它們的線上找到正確的點。將生成的顏色轉換回RGB以供顯示。

你也可以嘗試NSColor的blendedColorWithFraction:ofColor :,根據它的混合方式,它可以做你想做的。

+0

它需要是UIColor而不是NS,並且UI沒有該方法:-( – mootymoots 2010-01-26 21:03:36

0

用簡單的線性插值法做它。浮法是爲了精確。

float dr = (r_end - r_start)/(text_limit*1.0 - 1); 
float dg = (g_end - g_start)/(text_limit*1.0 - 1); 
float db = (b_end - b_start)/(text_limit*1.0 - 1); 
int x = start_x; 
for(int i=0; i<text_size; ++i) 
{ 
    PutOutColoredChar(x,start_y , text[i], (int)(r_start+(dr*i)) , ((int)g_start+(dg*i)), (int)(g_start+(db*i))); 
    x += WithOfChar(text[i]); 
} 

我不是色彩專家,但這對我來說並不醜。

3

這裏是UIColor一個類別可以使用在RGB或HSV 2 UIColor秒之間進行線性內插:

@implementation UIColor (Interpolate) 

+ (UIColor *)interpolateRGBColorFrom:(UIColor *)start to:(UIColor *)end withFraction:(float)f { 

    f = MAX(0, f); 
    f = MIN(1, f); 

    const CGFloat *c1 = CGColorGetComponents(start.CGColor); 
    const CGFloat *c2 = CGColorGetComponents(end.CGColor); 

    CGFloat r = c1[0] + (c2[0] - c1[0]) * f; 
    CGFloat g = c1[1] + (c2[1] - c1[1]) * f; 
    CGFloat b = c1[2] + (c2[2] - c1[2]) * f; 
    CGFloat a = c1[3] + (c2[3] - c1[3]) * f; 

    return [UIColor colorWithRed:r green:g blue:b alpha:a]; 
} 

+ (UIColor *)interpolateHSVColorFrom:(UIColor *)start to:(UIColor *)end withFraction:(float)f { 

    f = MAX(0, f); 
    f = MIN(1, f); 

    CGFloat h1,s1,v1,a1; 
    [start getHue:&h1 saturation:&s1 brightness:&v1 alpha:&a1]; 

    CGFloat h2,s2,v2,a2; 
    [end getHue:&h2 saturation:&s2 brightness:&v2 alpha:&a2]; 

    CGFloat h = h1 + (h2 - h1) * f; 
    CGFloat s = s1 + (s2 - s1) * f; 
    CGFloat v = v1 + (v2 - v1) * f; 
    CGFloat a = a1 + (a2 - a1) * f; 

    return [UIColor colorWithHue:h saturation:s brightness:v alpha:a]; 
} 

@end