1

上からボードに落ちるオブジェクトをアニメーション化しています。オブジェクトがボードに落ちると、ボードが「フォールバック」するアニメーションを作成したいと考えています。オブジェクトはボード上の任意のポイントに落下する可能性があり、ボードが「フォールバック」すると、ボードをより小さな縮尺にスケーリングします。

CGAffineTransformScale オブジェクトを使用すると、オブジェクトの中心であるアンカー ポイントに基づいてオブジェクトがスケーリングされます。ボードを拡大縮小してから、変形したボードと落下したオブジェクトを並べて、落下したオブジェクトがボードに対して同じ場所にとどまるようにします (より正確には、ボードはボードの位置に対して同じ場所)。

アンカーポイントをオブジェクトが落ちた位置に変更するのに何時間も費やしましたが、これにより、layer.anchorPoint が実際にどのように機能するかについての根本的な誤解が明らかになりました。

解決策は、ボードの中心から指定された落下オブジェクトまでのベクトルを導出し、変換でボードの位置を何らかの方法で調整して、同じ場所になるようにすることだと思います。ここで助けが必要です!

このような状況で予想されるように、アニメーション GIF が必要です。 ここに画像の説明を入力

4

1 に答える 1

2

CALayeranchorPointプロパティ 、これに使用する正しいプロパティですが、単位座標空間で機能するという小さな煩わしさがあります。つまり、ピクセルではなく0 から 1になります。

単位座標空間を使用して、このプロパティの値を指定します。このプロパティのデフォルト値は (0.5, 0.5) で、レイヤーの境界長方形の中心を表します。ビューに対するすべての幾何学的操作は、指定された点を中心に行われます。たとえば、デフォルトのアンカー ポイントを持つレイヤーに回転変換を適用すると、レイヤーはその中心を中心に回転します。アンカー ポイントを別の場所に変更すると、レイヤーがその新しいポイントを中心に回転します。

このため、アンカー ポイントをピクセル単位で設定すると、明らかに非常に奇妙な動作が発生します。適切に機能させるには、ユニット座標空間で新しいアンカーポイントを計算する必要があるため、次のようなことを行う代わりに:

board.layer.anchorPoint = CGPointMake(ball.x, ball.y);

あなたはこれをするでしょう:

board.layer.anchorPoint = CGPointMake(ball.x / board.layer.bounds.size.width,
                                      ball.y / board.layer.bounds.size.height);

更新:anchorPointプロパティを変更すると、ビューが移動します。これは、単位座標空間でレイヤーに対して相対的に設定される が、スーパービューの座標空間で設定されるanchorPointレイヤーのプロパティに固定されるためです。positionこのように、anchorPointプロパティの値を変更すると、新しいアンカー ポイントのポイントが古いアンカー ポイントと同じ場所になるようにビューが移動します。この回答で説明されているように、これを補う必要があります。

于 2013-07-13T06:08:25.057 に答える