メイン ビューをタップするジェスチャ レコグナイザーによってビューがアニメーション化されると、次のようになります。
-(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
最後に、この動作を指定するドキュメントや仕様はありますか?