如何生成随机的 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】:获得随机颜色的方法是使用 hue
、 saturation
和 brightness
//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?的主要内容,如果未能解决你的问题,请参考以下文章