Это сработало довольно хорошо.Это НЕ поможет тому факту, что у вас много повторяющихся цветов.См. Ниже:
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 и затем выполните сортировку.