首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在随机UIColor中避免浅色

在随机UIColor中避免浅色
EN

Stack Overflow用户
提问于 2017-02-13 06:09:56
回答 2查看 273关注 0票数 1

我正在产生随机的颜色。我想避免浅色如黄色,浅绿色等.这是我的密码

代码语言:javascript
复制
+ (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背景色。细胞的textLabel颜色是白色的。所以如果背景颜色是浅绿色或其他浅色,那么它就看不清楚.

怎么解决这个问题?我们可以避免产生浅色,或者我们能找到哪种颜色是浅色?

如果我们能发现那是浅色意味着我可以把文字颜色换成其他颜色..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-13 06:24:10

听起来你想避免接近白色的颜色。由于您已经在HSV空间,这应该是一个简单的问题,设置一个距离白色,以避免。一个简单的实现将限制饱和度和亮度不超过某个阈值。类似于:

代码语言:javascript
复制
if (saturation < kSatThreshold)
{
    saturation = kSatThreshold;
}
if (brightness > kBrightnessThreshold)
{
    brightness = kBrightnessThreshold;
}

更复杂的方法是检查与白色的距离,如果距离太近,就把它推回去:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-02-13 06:41:06

光色是指高亮度(或明度、光度.)的颜色。

生成具有随机色调和饱和度的颜色,但将亮度的随机性限制在较低的数字上,比如0到0.5。或者保持亮度不变。如果你并排显示颜色,如果你只改变HSB中的3种成分中的2种(HSV,HSL),其美学效果通常会更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42197644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档