1

私はこの問題の解決策を実装することができましたが、コードはかなり非効率的であるように見え、実際には、ユーザーが別の画面に移動した場合に遅延メソッド呼び出しが発生し続けると、少し面倒です。

基本的には、キャラクターの頭から吹き出しをアニメーションで表示したいので、小さな泡が表示され、その後に大きな泡、さらに大きな泡、そして最終的に小さなアニメーションを含むメインの泡が表示されます。各バブルを独自のメソッドで表示し、遅延を使用してメソッドを呼び出すことでこれを管理しました。

- (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 つの泡が含まれる 1 つの大きなアニメーションを作成できると思いますが、Interface Builder で泡を少し移動できるようにしたかったのですが、このアプローチではできません。多くの柔軟性を提供します。

どんな考えでも大歓迎です。

ありがとう、

マイケル

4

1 に答える 1

0

このシーケンスを実行するためのより良い方法がおそらくありますが、簡単な改善の 1 つは、変更を行う前にビューが表示されているかどうかを確認することです。そうすれば、ビューが別のビューに置き換えられた場合、これらは停止します:

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

また、これをどのスレッドから始めているのかわかりませんが、メインスレッドにあることを確認してください。UI 呼び出しは、メイン スレッドでのみ実行する必要があります。performSelectorOnMainThread:メソッドの 1 つを使用 して、メイン スレッドで開始できます。

于 2010-07-26T16:40:16.957 に答える