0

UIViews着信データに基づいて、アニメーションで動的に挿入したい。

2 つの非同期 URLRequest を送信し、受信したデータを別のスレッドから取得します。

さまざまなリクエストからのデータで動的に埋められるプロパティを観察しています。そのため、KVO は私にメッセージを送信してきます。

最初の受信メッセージで、いくつかの従属アニメーションを開始します。アニメーションの時間中に、新しいデータが到着し、オブザーバーにメッセージを送ることがよくあります。次に、アニメーションが終了するまで待ってから、新しいデータのアニメーションを開始します。

ブール値が変更されるまで待機する while ループを使用するものではなく、適切な実装を探しています。

編集: どのデータが最初に来るかはわかりません。そのため、アニメーション メソッドを最初のメソッドとして定義することはできません。

4

4 に答える 4

2

アニメーション用の kvoToDoList である可変配列を作成するのはどうですか。アニメーションを起動するために必要な情報をそこに入力します (kvo がトリガーされたオブジェクトなど)。

次に、kvo が観測されたら、オブジェクトを配列に追加し、次のようなアニメーション関数を呼び出します。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    self.kvoToDoList insertObject:object atIndex:0];
    // not sure here what you need to remember in order to do the animation, let's say it's just the object
    [self doAnimations];
}

- (void)doAnimations {

    if (self.kvoToDoList.count == 0) return;
    id object = [self.kvoToDoList lastObject];  // FIFO since we insert at index 0
    [self.kvoToDoList removeLastObject];

    [UIView animateWithDuration:someDuration delay:0.0 options:someOptions animations:^{
        // do animations here based on object
    } completion:^(BOOL finished) {
        // call this recursively, but performSelector so we don't wind up the stack
        [self performSelector:@selector(doAnimations) withObject:nil afterDelay:0.0];
    }];
}
于 2013-01-31T18:05:46.513 に答える
2

入ってくるビューを mutableArray に追加してから、次のようなものを使用するのはどうですか:

-(void) animateView:(UIView *)viewToAnimate{    

    [UIView animateWithDuration:0.5 animations:^{
        viewToAnimate.alpha = 0;
    }
                 completion:^(BOOL finished){
                     [_mutableArrayOfAnimationViews removeObject: viewToAnimate];
                     if ([_mutableArrayOfAnimationViews count] > 0) {
                         UIView *newAnimationView = [_mutableArrayOfAnimationViews objectAtIndex:0];
                         [self animateView: newAnimationView];
                     }
                 }];   
}

次に、配列がすでに空であるかどうかをビューがいつ入ってくるかを確認し、その場合は上記のメソッドを呼び出します...

于 2013-01-31T18:00:29.680 に答える
0

良いアイデアで私自身の質問に答えるために:
executionQueueまたはexecutionBlockについてどう思いますか?

アニメーションが進行している間、実行コードをブロック変数に保存すると思いました。アニメーション完了ブロックで、有効なexecutionBlockがあるかどうかを確認します。

ある場合は実行し、ない場合は何もしません。

また、非同期メッセージが届いたときに、ロードするブロックのアニメーション状態を保存する必要があります。

于 2013-01-31T18:19:55.427 に答える
0

おそらく、最初のアニメーションの完了ルーチンに通知を投稿します。

UIView animateWithDuration:delay:options:animations:completion:
于 2013-01-31T17:52:52.140 に答える