UIColor / RGB Путь от цвета X до цвета Y - PullRequest
2 голосов
/ 26 января 2010

Интересно, кто-нибудь мог бы предложить лучший способ перехода от одного цвета к другому в постепенном процессе.

Итак - у меня есть текстовое поле, на котором у меня есть текстовое ограничение. Я хотел бы, чтобы текст начинался с белого, но когда он достигнет максимального ограничения текста, он будет красным.

Есть ли простой способ сделать это? Я действительно не уверен, с чего начать ...

Ответы [ 4 ]

3 голосов
/ 11 июля 2014

Вот категория для UIColor, которую можно использовать для линейной интерполяции между двумя UIColor с в RGB или HSV:

@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
1 голос
/ 26 января 2010

Используйте HSL или HSV вместо RGB. Они имеют различные свойства, которые варьируются от 0 до 100 процентов, поэтому их можно масштабировать в коде.

Вот объектив c ссылкой .

0 голосов
/ 26 января 2010

Сделайте это с помощью простой линейной интерполяции. Поплавок для точности.

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

Я не эксперт по цвету, но для меня это не было некрасиво.

0 голосов
/ 26 января 2010

Вам необходимо преобразовать цвета конечной точки в цветовое пространство, где одним из параметров является интенсивность, чтобы вы могли сохранить эту константу. Предложение @ jvenema вполне приличное. Затем обработайте два других значения как две точки в двух измерениях и найдите правильную точку вдоль линии, соединяющей их в соответствии с положением ползунка. Преобразуйте полученный цвет обратно в RGB для отображения.

Вы также можете попробовать blendedColorWithFraction: ofColor: от NSColor, в зависимости от того, как он смешивается, он может делать то, что вы хотите.

...