如何随机放置 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 创建灰色叠加层?

Swift - UIButton

如何向放置在 UIStackView 中的以编程方式创建的 UIButton 添加约束

在 UIButton 上放置一个详细信息披露按钮