随机着色UIButton如何避免文字(黑色)和背景(白色)颜色?

时间:2014-05-25 14:42:36

标签: ios cocoa-touch random uikit

我有一个UIButton由标题文本和单色背景组成。按钮在白色UIView上绘制,标题文本为黑色。

我想在每次启动应用时随机着色按钮的背景。 这是我的实施:

#define KEY_COLOR_R @"KEY_COLOR_R"
#define KEY_COLOR_G @"KEY_COLOR_G"
#define KEY_COLOR_B @"KEY_COLOR_B"

+ (void)setThemeColorRandomly {

    //TODO: THEME COLOR NEEDS TO BE EASILY DISTINGUISHABLE WITH BLACK AND WHITE
    float r = [Helper getRandomFloatBetweenLow:0 high:1];
    float g = [Helper getRandomFloatBetweenLow:0 high:1];
    float b = [Helper getRandomFloatBetweenLow:0 high:1];

    [ModuleHelper cache_setFloat:r forKey:KEY_COLOR_R];
    [ModuleHelper cache_setFloat:g forKey:KEY_COLOR_G];
    [ModuleHelper cache_setFloat:b forKey:KEY_COLOR_B];
}

+ (UIColor *)themeColor {

    float r = [ModuleHelper cache_floatForKey:KEY_COLOR_R];
    float g = [ModuleHelper cache_floatForKey:KEY_COLOR_G];
    float b = [ModuleHelper cache_floatForKey:KEY_COLOR_B];

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

+setThemeColorRandomly

中调用-didFinishLaunching

现在我设置了颜色:

[self.settingsButton setBackgroundColor:[CacheHelper themeColor]];

问题是,我需要避免那些太轻(与背景混合)或太暗(与文本混合)的颜色。但我并不想限制颜色的多样性,例如:如果我为所有3种颜色设置范围为0.4-0.6,那么我将错过红色,这很容易用白色和黑色区分

编辑:

我需要避免的颜色不仅仅是完整的黑色和白色。我需要避免所有几乎无法区分的颜色。

关键部分是"可区分"。例如,非常浅蓝色的背景是一个糟糕的选择。

2 个答案:

答案 0 :(得分:2)

我建议使用hsb颜色模型,这样你就可以完全控制颜色的亮度:

//set your color randomly
CGFloat hue = [Helper getRandomFloatBetweenLow:0 high:1]; 
//you may play around with the saturation to get more colors as well
CGFloat saturation = 1; 
//adjust your desired min max values
CGFloat brightness = [Helper getRandomFloatBetweenLow:0.3 high:0.7];

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

答案 1 :(得分:1)

参见我的例子:

float r,g,b;

do {

    r = [Helper getRandomFloatBetweenLow:0 high:1];
    g = [Helper getRandomFloatBetweenLow:0 high:1];
    b = [Helper getRandomFloatBetweenLow:0 high:1];

} while(r == 0 && g == 0 && b == 0);

在这种情况下r gb如果全部为0(即黑色),则会重新计算。

如果相反,它们与0不同,那就好了。

您也可以扩展所有1的示例(白色)。

在你的情况下,你可以简单地避开按钮上的白色背景,然后所有相同的颜色:

float r,g,b, r1,g1,b1;

//Calculate the background different from white
do {

    r = [Helper getRandomFloatBetweenLow:0 high:1];
    g = [Helper getRandomFloatBetweenLow:0 high:1];
    b = [Helper getRandomFloatBetweenLow:0 high:1];

} while(r == 1 && g == 1 && b == 1);

//Calculate the text color different from the background
do {

    r1 = [Helper getRandomFloatBetweenLow:0 high:1];
    g1 = [Helper getRandomFloatBetweenLow:0 high:1];
    b1 = [Helper getRandomFloatBetweenLow:0 high:1];

} while(r1 == r && g1 == g && b1 == b);

或者,如果你想使用一系列音调来确保2种颜色足够不同,你可以使用例如最后一次:

} while(ABS(r1-r) > 0.3 && ABS(g1-g) > 0.3 && ABS(b1-b) > 0.3);

这是功能,您可以选择您的偏好和容忍度。

结果如下:

enter image description here