我正在创建一个问答游戏,我无法找到实现UIButton的最佳方式,它每隔3秒钟逐个消失。我可以让第一个UIButton在3秒后消失,但随后的UIButton需要相当长的时间。
我认为问题是我的代码变得更低效,每个UIButton我都会消失。我使用重复的NSInterval调用以下方法来使每个后续的UIButton消失:
- (无效)hideButton { int buttonNum;
while(buttonNum != -1)
{
buttonNum = rand() % 5;
if(buttonNum != [quiz correctNumber])
{
if(buttonNum == 0 && [buttonOne isEnabled] == YES)
{
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttonOne setEnabled:NO];
[buttonOne setAlpha:0.0];
[UIView commitAnimations];
}
else if(buttonNum == 1 && [buttonTwo isEnabled] == YES)
{
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttonTwo setEnabled:NO];
[buttonTwo setAlpha:0.0];
[UIView commitAnimations];
}
else if(buttonNum == 2 && [buttonThree isEnabled] == YES)
{
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttonThree setEnabled:NO];
[buttonThree setAlpha:0.0];
[UIView commitAnimations];
}
else if(buttonNum == 3 && [buttonFour isEnabled] == YES)
{
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttonFour setEnabled:NO];
[buttonFour setAlpha:0.0];
[UIView commitAnimations];
}
else if(buttonNum == 4 && [buttonFive isEnabled] == YES)
{
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttonFive setEnabled:NO];
[buttonFive setAlpha:0.0];
[UIView commitAnimations];
}
buttonNum = -1;
}
}
}
答案 0 :(得分:3)
当你只剩下2个按钮时,因为你仍然会产生一个介于0和4之间的随机数,你实际上只有20%的几率会让一个按钮消失 - 20%的时间你会消失什么也不做,因为随机数匹配正确的一个,在这些条件下60%的时间你什么也不做,因为它匹配已经消失的按钮。
我建议你保持一个数组最初填充参考4个可能实际消失的按钮(不要打扰正确的数字,因为你永远不会消失它)。在你的函数中,当你在该数组中有N个按钮时,生成一个介于0和N-1之间的随机数,这样你就可以用有效而简洁的代码消失相应的按钮 - 然后(如果消失的按钮不是最后一个)数组中的一个)与最后一个交换它并将N减1。当然,当N为1时,也不需要随机数。
答案 1 :(得分:1)
Alex Martelli的回答很好。另一种可能性是用单个按钮数组,按钮[5]替换单独的对象buttonOne,buttonTwo等,并用这个替换你的大循环:
do {
buttonNum = rand() % 5;
} while (buttonNum == [quiz correctNumber] || ![buttons[buttonNum] isEnabled]);
[buttons[buttonNum] setEnabled:NO]; // Doesn't need to be in animation block
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttons[buttonNum] setAlpha:0.0];
[UIView commitAnimations];
*** Dan,下面:将按钮隐藏顺序随机化并确保仍然不需要隐藏正确答案的东西,但除此之外,这也是一个很好的解决方案。
答案 2 :(得分:1)
按钮设置间隔消失的另一种方法是使用
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
方法。要使用它,您需要定义一个函数,使按钮在调用时消失:
-(void)hideButton:(UIButton *)button{
button.enabled = NO;
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[button setAlpha:0.0];
[UIView commitAnimations];
}
然后你会在这样的循环中吐出那些延迟选择器:
for(int i=0; i<numButtons; i++){
[self performSelector:@selector(mySelector:) withObject:buttons[i] afterDelay:3*i+3]
}