Ответ 1
Это сработало довольно хорошо. Это НЕ поможет в том, что у вас много повторяющихся цветов. См. Ниже:
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;
}];
Вы можете получить доступ к компонентам (HSBA), как это, в iOS 4.x:
CGFloat *components = (CGFloat *)CGColorGetComponents([color CGColor]);
float hue = components[0];
float saturation = components[1]; // etc. etc.
Чтобы избежать повторения цветов:, вы можете поместить элементы в NSMutableDictionary, на которые наложено что-то вроде яркости насыщенности оттенков (каждый округляется до ближайшего .10)... тогда вы получаете массив от THAT, а затем сортировку.