2010-01-26 93 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