4

メイン ビューをタップするジェスチャ レコグナイザーによってビューがアニメーション化されると、次のようになります。

-(void) doAnimate {
    [UIView animateWithDuration:3 

                     animations:^{
                         self.circleView.center = CGPointMake(100, 300);
                     }

                     completion:^(BOOL finished) {
                         NSLog(@"finished is %i", finished);
                         [UIView animateWithDuration:1 animations:^{
                             self.circleView.center = CGPointMake(250, 300);
                         }];
                     }
     ]; 
}

(連鎖アニメーションがあります)。アニメーション中にメイン ビューを再度タップすると、完了ハンドラが 2 回呼び出されます。最初は TRUE で、2 回目は FALSE で呼び出されます。一度だけ呼び出されると思っていたのに、FALSE? Apple のドキュメントで見つかりません。既にアニメーションしているときにアニメーションが開始された場合、どのように機能するかについてのルールはありますか? (同じビューが再びアニメーション化されていると思いますが、view1がアニメーション化されている間にview2がアニメーション化されている場合は適用されませんか?)


更新:次のコードは、より多くの洞察を示すことができます。

-(void) dropAnimate:(UIGestureRecognizer *) g {

    int n = arc4random() % 10000;
    int y = 501 + arc4random() % 200;
    NSLog(@"y is %i", y);
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, y, 10, 10)];
    label.text = @"x";
    [self.view addSubview:label];

    [UIView animateWithDuration:3 

                     animations:^{
                         NSLog(@"n is %i", n);
                         self.circleView.center = CGPointMake(100, y);
                     }
                     completion:^(BOOL finished) {
                         NSLog(@"n is %i", n);
                         NSLog(@"finished is %i   y is %i", finished, y);
                         [UIView animateWithDuration:3 animations:^{
                             self.circleView.center = CGPointMake(250, y);
                         }
                          ];

                     }

     ];
    NSLog(@"finished the method call");

}

以下の @Kai の回答に加えて、既にアニメーションが実行されている場合、同じ UIView オブジェクトの新しいアニメーションにはルールがあるようです: 古いアニメーションはその効果をすぐに終了し、新しいアニメーションが実行されますが、その後次に、古いアニメーションcompletionが で呼び出されNO、3 番目のアニメーションが開始され、アニメーション 2 の効果が終了しますが、次のcompletionブロックが で呼び出され、NOアニメーション 3 がすぐに有効になります...アニメーション 4 が 3 秒間実行されます。

上記のサンプル コードを試すことができます... 簡単にするために、completionブロックを削除してから試してみると、「同じオブジェクトで新しいアニメーションを開始すると、古いアニメーションが有効になる」というルールが確認されます。すぐに、新しいアニメーションが実行されます...

ブロックの場合、ブロックがさらに別のアニメーションを開始するとcompletion、非常に複雑になる可能性があります...completion

最後に、この動作を指定するドキュメントや仕様はありますか?

4

1 に答える 1

1

何が起こるかは次のとおりだと思います。

最初のトリガーは、ビューcenter(100,300)アニメーション化します(実際に表示する前に変更されることに注意してcenter propertyください)。2番目のトリガーはすぐに戻り(で呼び出しますcompletionYES、アニメーション化するものがないため(プロパティは以前にまったく同じ値に設定されています)、をリセットします。これcenterにより、最初のアニメーション(まだ実行中)がNOで停止します。circleviewは、新しいアニメーションを取得することにより、不要なアニメーションから切り離されますcenter(2番目のトリガーは、を呼び出す前に1番目のアニメーションを妨害しないことに注意してください。これはcompletioncircleview'scenter propertyが変更されていないためです)。

于 2012-06-04T13:08:21.290 に答える