如何生成随机的 UIColor?

Posted

技术标签:

【中文标题】如何生成随机的 UIColor?【英文标题】:How to generate a random UIColor? 【发布时间】:2014-05-19 06:58:37 【问题描述】:

我正在尝试从 8 个选项中生成随机颜色。我发现的所有堆栈溢出帖子/教程都是任何随机颜色。在我的 prefix.pch 中,我定义了 8 组不同的颜色定义,这是一个示例:

#define cola1       209/255.
#define colb1       0/255.
#define colc1       0/255.
#define cold1       1.0/255.

为 cola1-8、colb1-8、colc1-8 和 cold1-8 定义不同的颜色值。

然后我设置了一个随机数生成器:

int randomNumber; 

randomNumber = arc4random() %8;
randomNumber = randomNumber + 1;
whatRandomNumberIs = randomNumber;

然后我尝试在[UIColor colorWithRed etc] 中设置[NSString stringWithFormat:@"cola%i", randomNumber];

像这样:

[UIColor colorWithRed:[NSString stringWithFormat:@"cola%i", whatRandomNumberIs] green:[NSString stringWithFormat:@"colb%i", whatRandomNumberIs] blue:[NSString stringWithFormat:@"colc%i", whatRandomNumberIs] alpha:[NSString stringWithFormat:@"cold%i", whatRandomNumberIs]];

但后来意识到您不能将NSString 放入CGFloat

所以现在我被困住了。我将如何在不执行 NSString stringWithFormat 的情况下在红色、绿色、蓝色和 alpha 值中安装 1-8 的随机数?是否有另一种方法可以返回定义的随机 UIColor 值,因为我只希望它是特定颜色?

【问题讨论】:

检查this,他在这里生成随机颜色...可能对您有帮助... 【参考方案1】:

下面是你可以做的...

prefix.pch 你有如下。

#define colorCombination1 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination2 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination3 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination4 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination5 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination6 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination7 [UIColor colorWithRed:.... alpha:1.0];
#define colorCombination8 [UIColor colorWithRed:.... alpha:1.0];

现在你创建了这个颜色的数组..

NSArray *myColorArray = [[NSArray alloc] initWithObjects:colorCombination1, colorCombination2, colorCombination3, colorCombination4, colorCombination5, colorCombination6, colorCombination7, colorCombination8, nil];

现在你得到随机数说变量为generatedRandomNumber

UIColor *myRandomColor = [myColorArray objectAtIndex:generatedRandomNumber%8];

generatedRandomNumber%8 将为您提供generatedRandomNumber 的余数。

希望这是你想要的。

【讨论】:

【参考方案2】:

获得随机颜色的方法是使用 huesaturationbrightness

//random color
CGFloat hue = ( arc4random() % 256 / 256.0 ); // 0.0 to 1.0
CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0, away from white
CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5; // 0.5 to 1.0, away from black
UIColor *color = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1];

【讨论】:

我看过那个教程,但我不知道如何在 8 个值之间进行调整,因为这是针对任何随机颜色的 @LiamStockhomme:你定义了 8 种颜色?然后放入数组并使用 randomNumber%8 作为数组索引... @FahimParkar 它没有用,因为它没有让我把它变成 UIColor @LiamStockhomme 你是对的,你首先需要创建 UIColor 实例才能使用它。 @LiamStockhomme :您的意思是数组不允许在数组中使用 UIColor?【参考方案3】:

您试图在运行时构造一个字符串,然后将其用作在编译时定义的宏的名称。那是行不通的。在运行时没有关于编译时宏名称的信息。

这是从编译时定义的集合中选择随机颜色的一种正确方法。在UIColor的类别中定义一个返回随机颜色的方法:

@interface UIColor (Liam_RandomColor)

+ (UIColor *)Liam_randomColor;

@end

实现方法,首先(仅一次)初始化预定义颜色的数组,然后(每次)随机返回数组的一个元素:

@implementation UIColor (Liam_RandomColor)

+ (UIColor *)Liam_randomColor 
    static dispatch_once_t onceToken;
    static NSArray *colors;
    dispatch_once(&onceToken, ^
        colors = @[
            [UIColor colorWithRed:209/255.0 green:0 blue:0 alpha:1/255.0],
            [UIColor colorWithRed:50/255.0 green:100/255.0 blue:100/255.0 alpha:1],
            // etc.
        ];
    );

    return colors[arc4random_uniform(colors.count)];


@end

【讨论】:

对不起,如果我听起来很无知,但是将它插入 UIColor 并调用它的最佳方法是什么? 阅读“Categories Add Methods to Existing Classes” in Programming with Objective-C【参考方案4】:

您可以在 UIColor 上创建一个类别并将您预定义的颜色包装在一个方法中,类似于以下内容:

@interface UIColor (myCategory)
+ (UIColor *)randomColorForInt(int n);
@end

@implementation
+ (UIColor *)randomColorForInt(int n) 
    if (n == 0) 
        return [UIColor colorWithRed:cola1 green:colb1 blue:colc1 alpha:cold1]];
    
    ...

@end

【讨论】:

以上是关于如何生成随机的 UIColor?的主要内容,如果未能解决你的问题,请参考以下文章

自写常用扩展类

UIColor可以用深色和浅色两种颜色初始化吗?

IOS Quartz2D 通过UIColor生成图片

来自 UIColor 的纹理?

iOS UIColor与16进制颜色互转,渐变色绘制以及纯色图片生成(可以半透明)

随机颜色文件 用的时候直接推进去好方便