iPhone如何:按设定的间隔一个接一个消失的UI按钮
我正在创建一个智力竞赛游戏,但我想不出最好的方法来实现每隔3秒钟一个一个消失的UIButtons。我可以让第一个UIButton在3秒钟后消失,但随后的UIButton需要相当长的时间 我相信问题是,我的代码变得更加低效,我使每一个UIButton消失。以下方法是我通过重复NSInterval调用的方法,以使每个后续UIButton消失: -(无效)隐藏按钮 { 内纽扣iPhone如何:按设定的间隔一个接一个消失的UI按钮,iphone,objective-c,performance,uibutton,Iphone,Objective C,Performance,Uibutton,我正在创建一个智力竞赛游戏,但我想不出最好的方法来实现每隔3秒钟一个一个消失的UIButtons。我可以让第一个UIButton在3秒钟后消失,但随后的UIButton需要相当长的时间 我相信问题是,我的代码变得更加低效,我使每一个UIButton消失。以下方法是我通过重复NSInterval调用的方法,以使每个后续UIButton消失: -(无效)隐藏按钮 { 内纽扣 while(buttonNum != -1) { buttonNum = rand() % 5; if(bu
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和4之间的随机数,你只有20%的机会让一个按钮消失——20%的时候你什么也不做,因为随机数与正确的匹配,在这些情况下,60%的时间你什么也不做,因为它匹配一个已经消失的按钮
我建议您保留一个数组,最初填充有4个按钮的引用,这些按钮实际上可能会消失(不要麻烦将正确的数字1放在那里,因为您无论如何都不会消失它)。在函数中,当数组中还剩下N个按钮时,生成一个介于0和N-1之间的随机数,这样就可以用有效且简洁的代码将相应的按钮消失——然后(如果消失的按钮不是数组中的最后一个按钮)将其与最后一个按钮交换,并按1递减N。当然,当N为1时,也不需要随机数。当你只剩下,比如说,两个按钮时,因为你仍然生成一个介于0和4之间的随机数,你只有20%的机会让一个按钮消失——20%的时候你什么都不做,因为随机数与正确的匹配,在这些情况下,60%的时间你什么也不做,因为它匹配一个已经消失的按钮
我建议您保留一个数组,最初填充有4个按钮的引用,这些按钮实际上可能会消失(不要麻烦将正确的数字1放在那里,因为您无论如何都不会消失它)。在函数中,当数组中还剩下N个按钮时,生成一个介于0和N-1之间的随机数,这样就可以用有效且简洁的代码将相应的按钮消失——然后(如果消失的按钮不是数组中的最后一个按钮)将其与最后一个按钮交换,并按1递减N。当然,当N为1时,也不需要随机数。Alex Martelli给出了一个很好的答案。另一种可能是将单独的对象buttonOne、buttonTwo等替换为单个按钮数组button[5],并用以下内容替换大循环:
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,下面:仍然需要一些东西来随机调整按钮隐藏的顺序,并确保正确的答案没有被隐藏,但除此之外,这也是一个很好的解决方案。Alex Martelli给出了一个很好的答案。另一种可能是将单独的对象buttonOne、buttonTwo等替换为单个按钮数组button[5],并用以下内容替换大循环:
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,下图:仍然需要一些东西来随机调整按钮隐藏的顺序,并确保正确的答案没有被隐藏,但除此之外,这也是一个很好的解决方案。另一种让按钮以设定的间隔消失的方法是使用
- (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]
}
for(int i=0;i另一种使按钮按设定间隔消失的方法是使用
- (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]
}
for(int i=0;i