iPhone Как:UIButtons, Которые Исчезают Одна за Другой с Заданным интервалом

StackOverflow https://stackoverflow.com/questions/962852

Вопрос

Я создаю игру-викторину, и я не могу найти наилучший способ реализовать 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];

*** Дэн, ниже:Что-то, что могло бы рандомизировать порядок скрытия кнопок и убедиться, что правильный ответ не был скрыт, все равно было бы необходимо, но в остальном это тоже отличное решение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top