2016-06-01 12 views
1

現在、2つの異なる状態の小さなボタンを作成しています。すべての状態は2つのCAShapeLayerで表され、状態間の遷移は一連のCAKeyframeAnimations/CABasicAnimationでアニメートされ、すべてシェイプレイヤのパスプロパティが変更されます。私の質問は、どのように私は現在のアニメーションから開始する状態にアニメーション化する(アニメーション中にボタンが押されたか)です。CAKeyframeAnimationから現在のアニメーションステップを取得する方法

プレゼンテーション層に現在のプロパティ値を尋ね、アディティブアニメーション(完全に記述されているようにhere)を使用しますが、これはマルチステップアニメーションであるため、現在どのステップをアニメーション化しているのか把握する必要があります適切なアニメーションをチェーンして前の状態に戻します。しかしそれはややこしい(私はすべてのアニメーションをremoveOnCompletion=falseとし、どのアニメーションが現在アクティブでどのくらい遠いかを知るためにアニメーションの時間オフセットを照会したい)。

残念ながら、レイヤーの速度を0.0に設定し、逆方向に異なる動作をする2次アニメーションがあるため、timeOffsetを前後にアニメーション化するだけでは機能しません。

シェイプレイヤーのカスタムレイヤープロパティを使用するのは面倒ですが、現在のアニメーションステップよりも進捗プロパティーをより簡単に一致させることができます。

答えて

2

いくつかの試行錯誤の後、私は以下の「解決策」を思いつきました。私はを使ってすべてのフレームの時間更新を取得し、アニメーションが開始された時のタイムスタンプから現在のタイムスタンプを引いて、経過したアニメーション時間、したがって、アニメーションの継続時間(animationDuration)で割ることによって)そうすれば、逆のアニメーションをオフセットで開始することができます。内部的には、キーフレームアニメーションから次のフレームを計算し、新しい期間のkeyTimesを調整します。 これの実装を見ることができますhere

関連する問題