2011-12-21 39 views
10

tôi đang làm điều này loại:Sắp xếp Colours (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; 
} 

và, như tôi nghi ngờ, màu sắc đi ra khủng khiếp ra khỏi trật tự (bằng mắt). Các màu đỏ không phải là màu đỏ, các mẫu không phải với các mẫu màu, v.v.

Không có cách dễ dàng để tạo danh sách các màu sắc đa dạng, được nhóm theo tiêu chí của con người như "có màu xanh?"

+1

Không, bạn nên làm điều đó một câu trả lời :) – kennytm

+0

Đã làm điều đó, cảm ơn @ KennyTM. –

Trả lời

10

Điều này làm việc khá tốt. Nó sẽ KHÔNG giúp thực tế rằng bạn có rất nhiều màu sắc lặp đi lặp lại. Xem dưới đây:

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

Bạn có thể truy cập vào các thành phần (HSBA) như thế này trong iOS 4.x:

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

Để tránh lặp lại màu sắc: bạn có thể đặt các yếu tố trong một NSMutableDictionary , keyed trên một cái gì đó giống như màu sắc của họ-độ bão hòa-độ sáng (mỗi tròn đến gần nhất. 10) ... sau đó bạn nhận được mảng từ đó, và sau đó sắp xếp.

+0

Giá trị 'float' phải là' double', nếu không, giá trị đó sẽ xuất hiện lỗi 'EXC_BAD_ACCESS'. – aykutt

3

Tôi nghĩ rằng việc sử dụng [UIColor colorWithHue: saturation: brightness: alpha:] là đặt cược tốt nhất của bạn. Nếu bạn sửa chữa độ bão hòa, độ sáng và alpha và chỉ cần sử dụng Huế bạn sẽ nhận được tất cả các màu sắc theo thứ tự.

Khám phá the wiki for HSB để biết thêm thông tin.

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

Nếu bạn nhìn vào thông tin màu hsb, bạn sẽ chỉ cần một vòng lặp để có được phổ màu đầy đủ. – thelaws

+0

Chà, nếu bạn đạp xe qua bão hòa ở vòng ngoài, bạn sẽ có được một vật nhìn mạch lạc. Tốt đẹp! +1 –