2017-02-13 3 views
1

Я генерирую случайный uicolor. Я хочу, чтобы избежать светлые цвета, как желтый, светло-зеленый и т.д ... Вот мой кодИзбегайте светлого цвета в случайном UIColor

+ (UIColor *)generateRandom { 
    CGFloat hue = (arc4random() % 256/256.0); // 0.0 to 1.0 
    CGFloat saturation = (arc4random() % 128/256.0) + 0.5; // 0.5 to 1.0, away from white 
    CGFloat brightness = (arc4random() % 128/256.0) + 0.5; // 0.5 to 1.0, away from black 

    return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1]; 
} 

Я использую это для UITableViewCell цвет фона. Цвет текста в ячейке белый. Так что если цвет фона светло-зеленый или какой-либо другой светлый цвет его не видно четко ...

Как это исправить? Можем ли мы избежать генерации светлых цветов или можем ли мы найти светлый цвет?

Если мы можем обнаружить, что это светлый цвет означает, что я могу изменить TextColor в какой-то другой цвет ...

ответ

0

Это звучит, как вы хотите, чтобы избежать цвета, близкие к белому. Поскольку вы уже находитесь в пространстве HSV, это должно быть простым вопросом - установить расстояние от белого до избежания. Простая реализация ограничит насыщенность и яркость не ближе, чем к некоторому порогу. Что-то вроде:

if (saturation < kSatThreshold) 
{ 
    saturation = kSatThreshold; 
} 
if (brightness > kBrightnessThreshold) 
{ 
    brightness = kBrightnessThreshold; 
} 

что-то более сложное было бы проверить расстояние от белого, и если он слишком близко, толкать его обратно:

CGFloat deltaH = hue - kWhiteHue; 
CGFloat deltaS = saturation - kWhiteSaturation; 
CGFloat deltaB = brightness - kWhiteBrightness; 
CGFloat distance = sqrt(deltaH * deltaH + deltaS * deltaS + deltaB * deltaB); 
if (distance < kDistanceThreshold) 
{ 
    // normalize distance vector 
    deltaH /= distance; 
    deltaS /= distance; 
    deltaB /= distance; 
    hue = kWhiteHue + deltaH * kDistanceThreshold; 
    saturation = kWhiteSaturation + deltaS * kDistanceThreshold; 
    brightness = kWhiteBrightness + deltaB * kDistanceThreshold; 
} 
+0

Каковы значения, которые необходимо использовать для константы (например, kSatThreshold) –

+0

Это вам решать. Независимо от того, что вы чувствуете, достаточно далеко, чтобы быть читаемым, когда фон является тем цветом, а текст белым. Я просто экспериментирую и вижу, что работает. Я предполагаю, что 'kSatThreshold' должно быть где-то около .25-.5 и' kBrightnessThreshold' должно быть около 0,75, но это всего лишь предположение. – user1118321

+0

@ user1118321 Много беттей, чем мой ленивый ансва. Upvoted. –

0

Светлые цвета являются те, с высокой яркостью (или легкости, светимость ...).

Создайте цвета со случайным оттенком и насыщенностью, но ограничьте случайность яркости до низких чисел, например от 0 до 0,5. Или сохраняйте яркость постоянной. Если вы показываете цвета рядом друг с другом, эстетическое воздействие обычно лучше, если вы изменяете только два из 3 компонентов в HSB (HSV, HSL)

Смежные вопросы