0

CAKeyframeAnimationパスに沿ってアニメーション化するレイヤーがあります。transformアニメーションrotationModeがに設定されているため、レイヤーには変化するプロパティもありkCAAnimationRotateAutoます。

レイヤーをタップするとき(タップジェスチャレコグナイザーで検出し、この質問のようにpresentationLayerアニメーションレイヤーのヒットテストを行います。これを行うためのより良い方法がある場合は、私に知らせてください)、次のことを行います。

  1. 位置を取得し、プレゼンテーション層から変換します
  2. 現在のアニメーションを削除します。
  3. 手順1で取得した情報を使用して、変換と開始点を維持し、前のアニメーションが終了したばかりの場所から約40ピクセルの新しいエンドポイントへのレイヤーの通過を遅くする、新しいアニメーションをレイヤーに追加します。

最終的には、タップすると、元のキーフレームアニメーションが削除されたポイントで、パスに接する直線に沿ってアニメーションレイヤーが停止するまで遅くなります。

数学的にこれを行うにはどうすればよいですか?私はすでに開始点と変換を持っているので、おそらく開始点、変換、および距離(楽しみのために40と言う)を使用して、終点を理解する必要があるように思えます。何か案は?

4

1 に答える 1

2

私が正しく理解していれば、基本的に必要なのは、アニメートされたレイヤーが、タップしたときに移動しているのと同じベクトルに沿って減速して停止することです。タップしたときの位置とタップしたときの変形がある場合は、次のようにしてエンドポイントを見つけることができると思います。

CATransform3D transform = <Your layer's transform goes here>;
CGPoint startPoint = <Your layers's current position goes here>;
CGFloat distance = 40.f;

CGPoint v = CGPointMake(0, distance);

CGAffineTransform affineTransform = CATransform3DGetAffineTransform(transform);

CGPoint offset = CGPointApplyAffineTransform(v, affineTransform);
CGPoint endPoint = CGPointMake(startPoint.x + offset.x, startPoint.y + offset.y);

PS-これは、アニメーションの一部としてスケーリングやスキューなどを適用しない場合にのみ機能します(つまり、変換は回転と平行移動のみを表す必要があります)

于 2012-06-21T14:37:46.280 に答える