iPhone Как:UIButtons, Которые Исчезают Одна за Другой с Заданным интервалом
-
12-09-2019 - |
Вопрос
Я создаю игру-викторину, и я не могу найти наилучший способ реализовать UIButtons, которые исчезают одна за другой с интервалом в 3 секунды.Я могу заставить первую UIButton исчезнуть через 3 секунды, но последующие UIButtons занимают значительно больше времени.
Я считаю, что проблема в том, что мой код становится все более неэффективным с каждым UIButton, который я заставляю исчезнуть.Следующий метод - это то, что я вызываю с повторяющимся NSInterval, чтобы заставить каждый последующий UIButton исчезнуть:
-(пустота)Скрытая кнопка { 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;
}
}
}
Решение
Когда у вас осталось, скажем, всего 2 кнопки, поскольку вы все еще генерируете случайное число от 0 до 4, у вас есть только 20% шанс на самом деле заставить исчезнуть еще одну кнопку - в 20% случаев вы ничего не будете делать, потому что случайное число совпадает с правильным, и в 60% случаев в этих условиях вы ничего не будете делать, потому что оно соответствует уже исчезнувшей кнопке.
Я предлагаю вам сохранить массив, изначально заполненный ссылками на 4 кнопки, которые на самом деле могут исчезнуть (не утруждайте себя размещением правильного номера один там, так как вы все равно никогда не исчезнете).В вашей функции сгенерируйте случайное число в диапазоне от 0 до N-1, когда у вас останется N кнопок в этом массиве, чтобы вы могли удалить соответствующую кнопку с помощью эффективного и краткого кода - затем (если исчезнувшая кнопка не была последней в массиве) замените ее на последнюю и уменьшите N на единицу.Конечно, когда N равно 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]
}
Хороший ответ от Алекса Мартелли.Другой возможностью было бы заменить отдельные объекты buttonOne, buttonTwo и т.д.используя один массив кнопок, нажмите [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];
*** Дэн, ниже:Что-то, что могло бы рандомизировать порядок скрытия кнопок и убедиться, что правильный ответ не был скрыт, все равно было бы необходимо, но в остальном это тоже отличное решение.