2011-12-21 16 views
10

sto facendo questo genere di cose:Ordinare i colori (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; 
} 

e, come sospettavo, i colori escono terribilmente fuori ordine (ad occhio). I rossi non sono con i rossi, i viola non con i viola, ecc.

Non esiste un modo semplice per creare un elenco di colori diversi, ben raggruppati in base a criteri umani come "sembra blu?"

+1

No dovresti fare una risposta :) – kennytm

+0

Fatto, grazie a @KennyTM. –

risposta

10

Ha funzionato abbastanza bene. NON aiuterà il fatto che tu abbia molti colori ripetuti. Vedere di seguito:

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

È possibile accedere ai componenti (hSBA) come questo in iOS 4.x:

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

Per evitare di ripetere i colori: si può mettere gli elementi in un NSMutableDictionary , digitati su qualcosa come la loro saturazione tonalità-saturazione (ognuno arrotondato al più vicino .10) ... quindi si ottiene l'array da THAT e quindi si ordina.

+0

I valori 'float' dovrebbero essere' double', altrimenti dà un errore 'EXC_BAD_ACCESS'. – aykutt

3

Penso che usare [UIColor colorWithHue: saturazione: luminosità: alfa:] è la soluzione migliore. Se correggi saturazione, luminosità e alfa e usi solo la tonalità otterrai tutti i colori in ordine.

Per ulteriori informazioni, consultare 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

Se si guardano le informazioni sul colore hsb, sarà necessario un solo ciclo per ottenere lo spettro dei colori completo. – thelaws

+0

Wow, se passi attraverso le saturazioni sul loop esterno, ottieni una cosa dall'aspetto coerente. Bello! +1 –