在Objective-C中生成随机颜色的十六进制代码?

5

我该如何在Objective-C中生成随机颜色的十六进制代码?

我需要一个颜色的十六进制代码,不需要随机颜色。这比较复杂...


2
UIColor/NSColor 还是一个 #abcdef 的字符串? - kennytm
我不需要随机颜色,但我实际上需要一个颜色十六进制码(使用目的与颜色无关)。 - Kristina Brooks
4个回答

18

我认为这对你有用。Arc4random()在性能和准确性方面比rand()更好。Rand()在使用前还需要种子。

// 16777215 is FFFFFF
NSInteger *baseInt = arc4random() % 16777216;
NSString *hex = [NSString stringWithFormat:@"%06X", baseInt];

编辑:根据格式的评论进行了编辑。


1
几乎正确,但你需要使用 %06X,否则你会得到像 #AB 这样的颜色。 - kennytm
1
根据你的需要,将字符串格式化以包含#或不包含#。 - Matt S
3
我知道16777215等于0xFFFFFF,但为了更清楚地表明这个数字的来源,最好做成arc4random() % 0xFFFFFF - Dave DeLong
1
关于使用 arc4random(),它比 rand()random() 更好的伪随机数生成器,但在单元测试情况下,你必须设置一个种子的事实实际上是一个优势,因为这意味着你可以重复生成完全相同的数字序列。 - JeremyP
1
出于好奇,你为什么使用指向NSInteger的指针来生成数字? - Nava Carmon
显示剩余4条评论

6

在你的Objective-C应用程序中,可以使用标准的C库例程rand()。然后,您需要调用它三次来获取每个随机颜色的红色、绿色和蓝色通道的随机值。您需要使用最大值(通常为256)对该值进行取模(%),以获取通道所能具有的最大值。从那里开始,您可以适当地构造NSColor。所以你的代码可能会像这样:

int red = rand() % 255;
int green = rand() % 255;
int blue = rand() % 255;
NSColor* myColor = [NSColor colorWithCalibratedRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1.0];

由于NSColor使用浮点数而不是整数,因此更好的方法是从一开始就将随机值除以RAND_MAX:

float rand_max = RAND_MAX;
float red = rand() / rand_max;
float green = rand() / rand_max;
float blue = rand() / rand_max;
NSColor* myColor = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:1.0];

这段代码不会限制颜色数量为24位光谱。

是的,但那样你只会得到RGB值 - 它没有被转换为十六进制值和串联起来(生成十六进制颜色代码),显然OP需要它这样做。 - Sune Rasmussen
是的,他在澄清他具体想要什么之前,我已经发布了我的答案。 - fbrereto
使用random()而不是rand()。 rand()的低12位会经过循环模式。 此外,rand()%255可以为您提供0-254范围内的数字。 - JeremyP

0

0

仅供简短记录:

根据您的需求,您可能需要考虑编写一个不太随机的颜色生成器。(例如,当您想要为生成的颜色设置“规则”时。)因此,您可能需要通过限制HSB中的随机生成值来获取颜色代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接