ビューが時計回りに 45 度回転し、ユーザーがその中心を特定の線の上にドラッグすると赤い円を追加するアニメーション動作を作成しようとしています。この同じビューを同じ線の下にドラッグすると、元の方向に戻り、赤い円が削除されます。ビューがアニメーション カーブで 45 度回転するのに 3 秒かかりますUIViewAnimationCurveEaseInOut
。
この動作を具現化する 2 つの関数と が- (void)viewHasMovedAboveLine:(UIView *)view
あり- (void)viewHasMovedBelowLine:(UIView *)view
、ユーザーがビューを線の上または下にドラッグしたときに呼び出されます。これらの関数には両方とも、完了ハンドラを持つアニメーションが含まれています+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
。完了ハンドラーは、必要に応じて赤い円を追加または削除します。
options:
アニメーションを実行する前に値を設定しUIViewAnimationOptionBeginFromCurrentState
て確認し、view.layer.animationKeys.count
アニメーションがある場合はすべて削除することにより、アニメーションの途中でユーザーがビューを線を越えてドラッグして戻した場合、アニメーションを正しく回転させることができます。経由で現在実行中のすべて[view.layer removeAllAnimations]
。
ただし、 を使用しても、前のアニメーションの完了ハンドラーは引き続き実行されるよう[view.layer removeAllAnimations]
です。そのアニメーションが現在実行されている場合、アニメーションとその完了ハンドラーの両方を停止する方法はありますか?
アニメーションごとにプライベート プロパティを作成するよりも、より洗練されたものを好むでしょ@property (nonatomic) BOOL animation01IsCurrentlyExecuting
う@property (nonatomic) BOOL animation02IsCurrentlyExecuting
。理想的なソリューションは、アニメーション コードと完了ハンドラーの両方を含むさまざまなアニメーション シナリオを網羅することです。
また、アニメーションが中断されたときに、アニメーションがどこまで進んだかを確認する方法はありますか? 私自身はタイミングに関心があり (たとえば、アニメーションが 2.1 秒後に中断された)、それ以降のアニメーションが適切なタイミングで行われることを確認できます。