颜色分类(Objective-C)

10

我正在做这样的事情:

- (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;
}

正如我所怀疑的那样,颜色非常混乱(在眼中)。红色与红色不匹配,紫色与紫色不匹配等等。

是否有一种简单的方法可以创建一个多样化的颜色列表,并根据人类标准进行漂亮的分组,比如“那看起来是蓝色的”?


1
不,你应该把它变成一个答案 :) - kennytm
2个回答

10

这方法确实很有效。但是它并不能解决你有许多重复颜色的问题。请看下面:

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 错误。 - AykutE

3

我认为使用[UIColor colorWithHue:saturation:brightness:alpha:]是最好的选择。如果您固定饱和度、亮度和透明度,仅使用色调,就可以按顺序获得所有颜色。

查看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颜色信息,您只需要一个循环即可获得完整的颜色谱。 - thelaws
哇,如果你在外层循环中循环饱和度,你会得到一个连贯的东西。不错!+1 - Dan Rosenstark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接