如何随机放置 UIButton 和值
Posted
技术标签:
【中文标题】如何随机放置 UIButton 和值【英文标题】:how to random placement of UIButton and value 【发布时间】:2012-03-15 05:41:55 【问题描述】:我有一个问题视图,将显示 4 个答案,只有 1 个是正确的。
但我不希望同一个按钮始终是正确答案。
我想知道如何每次随机放置 4 个 UIButton 和值。
当用户再次进入这个问题时,答案将在不同的按钮中
我的 X,y,W,H 位置
按钮 1 5,219,230,45
按钮 2 5,273,230,45
按钮 3 244,224,230,45
按钮 4 244,273,230,45
【问题讨论】:
您可以为每个按钮设置标签(1,2,3,4)。然后使用随机函数找到标签并为该按钮设置“正确”文本。 【参考方案1】:我已经在我身边实现了相同的代码,它工作正常。
-(void)randomAllocation
NSMutableArray* allstring = [[NSMutableArray alloc]initWithObjects:@"Correct",@"Wrong",@"Wrong1",@"Wrong2", nil];
NSMutableArray* outcomeOFrandom = [[NSMutableArray alloc]init];
for (int i=0; i<[allstring count]; i++)
int temp = 0;
while (temp==0)
int randomInt = arc4random() % 4;
BOOL result = [outcomeOFrandom containsObject:[allstring objectAtIndex:randomInt]];
if (result==FALSE )
UIButton* btn = [[UIButton alloc]init];
[btn setTitle:[allstring objectAtIndex:randomInt] forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor blackColor]];
NSLog(@"tital=%@",[allstring objectAtIndex:randomInt]);
if (i==0)
[btn setFrame:CGRectMake(5,219,230,45)];
else if(i==1)
[btn setFrame:CGRectMake(5,273,230,45)];
else if(i==2)
[btn setFrame:CGRectMake(244,224,230,45)];
else if(i==3)
[btn setFrame:CGRectMake(244,273,230,45)];
[outcomeOFrandom addObject:[allstring objectAtIndex:randomInt]];
[self.view addSubview:btn];
[btn release];
temp=1;
break;
【讨论】:
【参考方案2】:我碰巧正在开发一个类似的游戏应用程序,所以得到了一些肯定会有所帮助的代码。看看下面。请注意,我已经说明了您将调用“正确的答案方法”和“错误的答案方法”来获得正确和错误的按钮点击。
// Define the four buttons in their respective frames, create the first button as the correct one, we'll shuffle it later.
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setTitle:@"Correct Answer" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(correctAnswerMethod:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button1];
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setTitle:@"Wrong Answer 1" forState:UIControlStateNormal];
[button2 addTarget:self action:@selector(wrongAnswerMethod:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button2];
UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button3 setTitle:@"Wrong Answer 2" forState:UIControlStateNormal];
[button3 addTarget:self action:@selector(wrongAnswerMethod:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button3];
UIButton *button4 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button4 setTitle:@"Wrong Answer 3" forState:UIControlStateNormal];
[button4 addTarget:self action:@selector(wrongAnswerMethod:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button4];
//Create an array with the rectangles used for the frames
NSMutableArray *indexArray = [NSMutableArray arrayWithObjects:
[NSValue valueWithCGRect:CGRectMake(5, 219, 230, 45)],
[NSValue valueWithCGRect:CGRectMake(5, 273, 230, 45)],
[NSValue valueWithCGRect:CGRectMake(244, 219, 230, 45)],
[NSValue valueWithCGRect:CGRectMake(244, 273, 230, 45)], nil];
//Randomize the array
NSUInteger count = [indexArray count];
for (NSUInteger i = 0; i < count; ++i)
int nElements = count - i;
int n = (arc4random() % nElements) + i;
[indexArray exchangeObjectAtIndex:i withObjectAtIndex:n];
//Assign the frames
button1.frame = [((NSValue *)[indexArray objectAtIndex:0]) CGRectValue];
button2.frame = [((NSValue *)[indexArray objectAtIndex:1]) CGRectValue];
button3.frame = [((NSValue *)[indexArray objectAtIndex:2]) CGRectValue];
button4.frame = [((NSValue *)[indexArray objectAtIndex:3]) CGRectValue];
【讨论】:
【参考方案3】:您可以始终在相同位置创建按钮并随机化按钮上的标签。如果您使用数组来提供 val1、val2、val3 等标签,您可以随机化数组。
【讨论】:
【参考方案4】:我建议不要改变按钮的位置,你可以做的是随机改变按钮的currentTitle
属性,一旦用户点击按钮;您可以获取按钮的currentTitle
并检查它是否正确。
【讨论】:
【参考方案5】:在 4 个选项中只有一个是正确的,所以您不必担心,只需为您的 UIButton 提供标签。在 touchUpInside 事件或您对其指定的任何操作中。只需将正确答案标签与用户触摸的按钮标签匹配即可。
你应该设置一些逻辑来随机设置不同按钮标签的答案。
【讨论】:
【参考方案6】:您应该创建按钮并将它们添加为subView
。当您需要将按钮放置在随机位置时,您可以使用:
[button1 setFrame:CGRectMake(5,219,230,45)];
[button2 setFrame:CGRectMake(5,273,230,45)];
[button3 setFrame:CGRectMake(244,224,230,45)];
[button4 setFrame:CGRectMake(244,273,230,45 )];
【讨论】:
【参考方案7】:我认为您不需要在此处设置按钮的 x 和 y。只需设置按钮的标签,比如标签 1 - 4,生成随机数 1 - 4(按钮的可能标签),将按钮保存到 NSArray 并执行如下循环:
NSArray *buttonsArr = [[NSArray alloc]initWithObjects:button1,button2, button3, button4, nil];
int randomInt = (arc4random() % 4) + 1;
for (int i = 0; i < [buttonsArr count]; i++)
if ([(UIButton*)[buttonsArr objectAtIndex:i] tag] == randomInt)
[[buttonsArr objectAtIndex:i] setTitle:@"correct" forState:UIControlStateNormal];
else
[[buttonsArr objectAtIndex:i] setTitle:@"wrong" forState:UIControlStateNormal];
【讨论】:
【参考方案8】:使用这 4 个按钮创建您自己的类。在这个类中,您可以存储按钮的位置。然后你可以添加一个成员函数(如下所示)来绘制它们:
-(void)drawButtonsWithIncorrectAtIndex:(int)index
【讨论】:
以上是关于如何随机放置 UIButton 和值的主要内容,如果未能解决你的问题,请参考以下文章
UIButton 内的 UIImageView 具有默认填充 - 如何删除?
如何在导航栏上的 UIBarButtonItem 内偏移 UIButton 图像?
如何以编程方式为处于触摸状态的 UIButton 创建灰色叠加层?