Лучший способ разбить вызовы метода / отобразить 3 UIImageViews в отложенной последовательности - PullRequest
1 голос
/ 26 июля 2010

Мне удалось реализовать решение этой проблемы, однако код кажется довольно неэффективным, и на самом деле отложенные вызовы методов оказываются немного проблематичными, когда они продолжают срабатывать, если пользователь перешел на другой экран.

По сути, я хочу, чтобы мысленный пузырь появлялся из головы персонажа, но был анимированным, чтобы появлялся маленький пузырь, затем еще больший, еще больший и, в конечном счете, главный пузырь, который затем содержит небольшую анимацию. Мне удалось это, отобразив каждый пузырь с его собственным методом, а затем вызвав методы с задержками:

- (void)showMood {
    animating = TRUE;
    [self showBubble1];
}

- (void)showBubble1 {
    bubble1.hidden = FALSE;
    [self performSelector:@selector(showBubble2) withObject:nil afterDelay:kBubbleDelay];
}

- (void)showBubble2 {
    bubble2.hidden = FALSE;
    [self performSelector:@selector(showBubble3) withObject:nil afterDelay:kBubbleDelay];
}

- (void)showBubble3 {
    bubble3.hidden = FALSE;
    [self performSelector:@selector(showThoughtBubble) withObject:nil afterDelay:kBubbleDelay];
}

- (void)showThoughtBubble {
    thoughtBubble.hidden = FALSE;   
    [self startBubbleAnimations];
    [self performSelector:@selector(hideThoughtBubble) withObject:nil 

afterDelay:kAnimationDuration * kAnimationRepeatCount];
    }

- (void)hideThoughtBubble {
    bubble1.hidden = TRUE;
    bubble2.hidden = TRUE;
    bubble3.hidden = TRUE;
    thoughtBubble.hidden = TRUE;
    [bubbleAnimation stopAnimating];
    animating = FALSE;
}

Полагаю, я мог бы создать одну большую анимацию, в которой все пузыри являются частью одного и того же кадра, а каждый кадр содержит еще один пузырек, но я как бы хотел немного переместить пузыри в Интерфейсном Разработчике и в этом подходе не предлагает большой гибкости.

Любые мысли будут очень признательны.

Спасибо,

Майкл

1 Ответ

0 голосов
/ 26 июля 2010

Возможно, есть лучшие способы сделать эту последовательность, но одним простым улучшением будет проверка, чтобы увидеть, виден ли вид, прежде чем вносить изменения. Таким образом, если представление было заменено другим, оно остановится:

- (void)showBubble1 {
    if (bubble1.window) {   // check to see if view is visible
        bubble1.hidden = NO;
        [self performSelector:@selector(showBubble2) withObject:nil afterDelay:kBubbleDelay];
    }
}

Кроме того, я не уверен, с какого потока вы начинаете это, но убедитесь, что он находится в основном потоке. Вызовы пользовательского интерфейса должны выполняться только в основном потоке. Вы можете использовать один из методов executeSelectorOnMainThread: , чтобы запустить его в главном потоке.

...