sorting颜色(Objective-C)

我正在做这样的事情:

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

而且,正如我怀疑的那样,这些颜色会出现严重的错误(对眼睛)。 红色不是红色,紫色不是紫色,等等。

有没有简单的方法来创build一个不同颜色的清单,根据人类标准很好地分组,如“看起来很蓝”?

这工作得很好。 这不会有助于你有很多重复的颜色的事实。 见下文:

 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中,按照他们的色调 – 饱和度 – 亮度(每个都舍入到最接近的10)。然后你从THAT中得到数组,然后sorting。

我认为使用[UIColor colorWithHue:饱和度:亮度:alpha:]是你最好的select。 如果你修复饱和度,亮度和alpha,只使用Hue,你会得到所有的颜色。

查看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]; } 
Interesting Posts