我有一个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,那么我将错过红色,这很容易用白色和黑色区分
编辑:
我需要避免的颜色不仅仅是完整的黑色和白色。我需要避免所有几乎无法区分的颜色。
关键部分是"可区分"。例如,非常浅蓝色的背景是一个糟糕的选择。
答案 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 g
和b
如果全部为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);
这是功能,您可以选择您的偏好和容忍度。
结果如下: