Cocoa中是否有任何方法可以帮助迭代所有NSColor值(仅限R,G,B,未触及alpha)?

时间:2010-05-30 19:39:31

标签: cocoa nscolor

我需要一个函数,对于给定的R,G,B值返回下一个颜色。

通过说下一个颜色,我指的是其中一个成分改变1的颜色(假设R,G,B值的范围是0-255)。

必须以这样的方式构造:从白色(或者黑色)开始,您可以迭代所有颜色(计数为255 * 255 * 255)。这将是很好的,但并不要求在迭代所有颜色之后,它们从头开始重复。

2 个答案:

答案 0 :(得分:2)

您可以使用自定义或Apple等“Web Safe Colors”color lists上进行颜色检索:

NSColorList* cl = [NSColorList colorListNamed:@"Web Safe Colors"];
NSLog(@"%@", cl);
for (NSString *key in [cl allKeys]) { 
    NSLog(@" * %@ - %@", key, [cl colorWithKey:key]);
}

如果您需要更多且订单无关紧要,可以使用例如+colorWithColorSpace:components:count:

uint32_t c = 0;
// increment c whenever a color is requested ...

CGFloat components[4] = { 
    ((c & 0xFF0000) >> 16) / 256.0, 
    ((c & 0x00FF00) >> 8 ) / 256.0,
    ((c & 0x0000FF) >> 0 ) / 256.0,
    0.0 
};
NSColor *color = [NSColor colorWithColorSpace:[NSColorSpace genericRGBColorSpace] 
                                   components:components 
                                        count:4];

答案 1 :(得分:1)

目前尚不清楚“下一个颜色”是什么意思,但您可以轻松拥有一个从中提取组件的计数器:

uint32 color = 0;

uint8 r = color%256;
uint8 g = (color/256) % 256;
uint8 b = (color/(256*256)) % 256;

// use color

++color;

否则您只需生成随机颜色并跟踪已使用的颜色NSSet。当然,您将在一个对象中打包3个组件,如int