【问题标题】:Sort Colors (Objective-C)排序颜色(Objective-C)
【发布时间】:2012-01-24 23:34:57
【问题描述】:

我正在做这样的事情:

- (NSArray*)colors {
    float divisor = .3333;
    NSMutableArray *retVal = [NSMutableArray array];
    for (float one=0; one <= 1.0f; one += divisor) {
        for (float two = 0; two <= 1.0f; two += divisor) {
            for (float three = 0; three <= 1.0f; three += divisor) {
                UIColor *color = [UIColor colorWithRed:one green:two blue:three alpha:.5];
                // also bad
                // UIColor *color = [UIColor colorWithHue:one saturation:two brightness:three alpha:.5];
                [retVal addObject:color];
            }
        }
    }
    return retVal;
}

而且,正如我所怀疑的那样,颜色非常混乱(在眼睛看来)。红不配红,紫不配紫等。

有没有简单的方法可以创建一个不同颜色的列表,根据人类标准很好地分组,例如“看起来是蓝色的”?

【问题讨论】:

  • 不,你应该这样回答:)

标签: objective-c ios color-palette


【解决方案1】:

我认为使用 [UIColor colorWithHue:saturation:brightness: alpha:] 是你最好的选择。如果您修复饱和度、亮度和 alpha 并仅使用 Hue,您将按顺序获得所有颜色。

查看the wiki for HSB了解更多信息。

for (float hsb = 0; hsb <= 1.0f; hsb += divisor) {
             UIColor *color = [UIColor colorWithHue:hsb saturation:1.0f brightness:1.0f alpha:.5f];
            [retVal addObject:color];
}

【讨论】:

  • 如果您查看 hsb 颜色信息,您只需一个循环即可获得完整的色谱。
  • 哇,如果你在外循环的饱和度中循环,你会得到一个连贯的东西。好的! +1
【解决方案2】:

这工作得很好。您有很多重复的颜色这一事实无济于事。见下文:

NSArray *sorted = [[dict allValues] sortedArrayUsingComparator:^NSComparisonResult(UIColor* obj1, UIColor* obj2) {
    float hue, saturation, brightness, alpha;
    [obj1 getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];
    float hue2, saturation2, brightness2, alpha2;
    [obj2 getHue:&hue2 saturation:&saturation2 brightness:&brightness2 alpha:&alpha2];
    if (hue < hue2)
        return NSOrderedAscending;
    else if (hue > hue2)
        return NSOrderedDescending;

    if (saturation < saturation2)
        return NSOrderedAscending;
    else if (saturation > saturation2)
        return NSOrderedDescending;

    if (brightness < brightness2)
        return NSOrderedAscending;
    else if (brightness > brightness2)
        return NSOrderedDescending;

    return NSOrderedSame;
}];

您可以在 iOS 4.x 中像这样访问组件 (HSBA):

    CGFloat *components = (CGFloat *)CGColorGetComponents([color CGColor]);
    float hue = components[0];
    float saturation = components[1]; // etc. etc.

为避免重复颜色:您可以将元素放在 NSMutableDictionary 中,并键入它们的色调饱和度亮度(每个四舍五入到最接近的 0.10)...然后您会得到数组,然后排序。

【讨论】:

  • float 值应该是double,否则会给出EXC_BAD_ACCESS 错误。
猜你喜欢
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2010-11-18
  • 2017-06-02
  • 2016-03-15
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多