iPhone Как: UIB-кнопки, которые исчезают один за другим в заданном интервале - PullRequest
1 голос
/ 08 июня 2009

Я создаю игру-викторину и не могу найти лучший способ реализации кнопок UIB, которые исчезают одна за другой с интервалом в 3 секунды. Я могу заставить первый UIButton исчезать через 3 секунды, но последующие UIButton занимают значительно больше времени.

Я считаю, что проблема в том, что мой код становится все более неэффективным с каждым исчезновением UIB-кнопки. Следующий метод - это то, что я называю повторяющимся 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;
    }
}

}

Ответы [ 3 ]

3 голосов
/ 08 июня 2009

Если у вас есть только, скажем, 2 кнопки слева, поскольку вы по-прежнему генерируете случайное число в диапазоне от 0 до 4, у вас есть только 20% шансов на фактическое исчезновение еще одной кнопки - 20% времени ничего не делать, потому что случайное число соответствует правильному, и в 60% случаев при таких условиях вы ничего не делаете, потому что оно соответствует уже исчезнувшей кнопке.

Я предлагаю вам сохранить массив, изначально заполненный ссылками на 4 кнопки, которые могут фактически исчезнуть (не пытайтесь поместить туда правильную цифру, так как вы никогда не пропадете). В вашей функции сгенерируйте случайное число от 0 до N-1, когда в этом массиве осталось N кнопок, чтобы вы могли пропустить соответствующую кнопку с эффективным и кратким кодом - затем (если исчезнувшая кнопка была не последней один в массиве) замените его последним и уменьшите N на единицу. Конечно, когда N равно 1, случайное число также не нужно.

1 голос
/ 09 июня 2009

Другой способ заставить кнопки исчезать через заданные интервалы времени - использовать

- (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]
}
1 голос
/ 08 июня 2009

Хороший ответ от Алекса Мартелли. Другой возможностью было бы заменить отдельные объекты 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];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...