ブロックを使用して、同じUIImageViewで2つのアニメーションを実行しています。アニメーションは完全に連続しているわけではありませんが、ほとんどです。間にいくつかのロジックがあります。
- ビューのある場所から別の場所にUIImageViewをアニメーション化します。
- 画像をそこにとどまらせるかどうかを決定するロジックを実行する
- 許可されていない場合は、アニメーションを元に戻します(UIImageViewは元の場所に戻ります)
上記のようにこれを実装すると、2番目のアニメーションのみが表示されます(これは私が理解していることからの正常な動作です)。最初のアニメーションの完了ブロック内にロジックと2番目のアニメーションブロックをネストすると、両方のアニメーションが表示されますが、その完了ブロックにかなりの量のコードが詰まっていて、見苦しくて場違いに見えます。
ネストされていない構成で、iOSが前のアニメーションを短くして最後のアニメーションのみを実行したいのはなぜですか?また、次のアニメーションに進む前に最初のアニメーションを待機させるにはどうすればよいですか?メインスレッドをブロックしたり、完了ブロックで「座ってスピン」したりする必要はないと思います。すべてのアニメーションを表示したいだけです。2番目のアニメーションに遅延を追加しようとしましたが無駄になりました。
これはCAKeyframeAnimationの仕事ですか?
// first animation
[UIView animateWithDuration:0.5
delay:0.0
options: UIViewAnimationCurveLinear
animations:^{movingColor.center = newCenter;
movingColor.transform = scaleTransform;}
completion:^(BOOL finished){ NSLog(@"forward animation done");}];
if (/* ...color is allowed at that location */) {
// do some stuff
} else {
// undo the animation
[UIView animateWithDuration:0.5
delay:0.0
options: UIViewAnimationCurveLinear
animations:^{movingColor.center = origCenter;
movingColor.transform = scaleTransform;}
completion:^(BOOL finished){ NSLog(@"back animation done");}];
}