2011-12-21 17 views
10

robię tego rodzaju rzeczy:Uporządkuj Kolory (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; 
} 

i, jak podejrzewałem, kolory wyjdzie potwornie out of order (dla oka). Czerwone nie są z czerwieniami, fioletami nie z purpurami, itp.

Czy nie ma łatwego sposobu na stworzenie listy różnorodnych kolorów, ładnie pogrupowanych według ludzkich kryteriów, takich jak ", który wygląda na niebieski?"

+1

Nie, powinieneś zrobić, że odpowiedź :) – kennytm

+0

Czy to, dzięki @KennyTM. –

Odpowiedz

10

To zadziałało całkiem dobrze. NIE pomoże to w tym, że masz wiele powtarzających się kolorów. Patrz poniżej:

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

można uzyskać dostęp do komponentów (hSBA) jak to w iOS 4.x:

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

Aby uniknąć powtarzania kolorów: można umieścić elementy w NSMutableDictionary , wpisane na coś takiego jak ich nasycenie-nasycenie-jasność (każda zaokrąglona do najbliższej .10) ... wtedy otrzymasz tablicę z TEGO, a następnie sortuj.

+0

Wartości 'float' powinny być" podwójne ", w przeciwnym razie wystąpi błąd" EXC_BAD_ACCESS ". – aykutt

3

Myślę, że używanie [UIColor colorWithHue: saturation: brightness: alpha:] jest najlepszym wyborem. Jeśli poprawisz nasycenie, jasność i alfa i po prostu użyjesz Hue, uzyskasz wszystkie kolory w kolejności.

Aby uzyskać więcej informacji, sprawdź numer 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]; 
} 
+0

Jeśli spojrzysz na informacje o kolorze hsb, potrzebujesz tylko jednej pętli, aby uzyskać pełne spektrum kolorów. – thelaws

+0

Wow, jeśli przejdziesz przez nasycenia na zewnętrznej pętli, uzyskasz spójną rzecz. Miły! +1 –