1

私はこれをやろうとしています:すでにある値に回転されているビューがあります.15度としましょう。

15 度回転したビューを想像してください。

次に、このビューを現在の回転から 40 度回転させたいということだけはわかっています。

そのビューが 15 度から 40 度に回転する様子を想像してみてください。

練習のために、CAKeyFrameAnimation でそれを行いたいと思います。しかし、問題は、私ができることは、どこからどこまでを厳密に指定することだけです. UIView アニメーションのような便利な「現在の状態を取得する」機能はありませんよね? どうすればいいですか?

また、必要な回転量に関係なく、その回転に常に 3 つのキーフレームを指定したいと考えています。

3 つのキーフレームを使用して、ビューが 15 度から 40 度まで回転する様子を想像してみてください。

しかし、別の大きな問題があります。別のアニメーションが別のターゲットで開始しなければならない場合があります。ビューが現在 20 度から 100 度まで回転していて、アニメーションのちょうど中間で新しいアニメーションが開始され、そのビューを 15 度にしたいとします。シンプルな UIView アニメーションを使用します。CAKeyFrameAnimation でそれを行う方法は?

基本的に、現在の状態を取得する UIView アニメーションのように動作するようにしたい ;)

CALayer* theLayer = rotatedView.layer;

CAKeyframeAnimation* animation;
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

animation.duration = 2;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

animation.values = [NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:(10.0 / 180.0) * M_PI],
                    [NSNumber numberWithFloat:(20.0 / 180.0) * M_PI],
                    [NSNumber numberWithFloat:(30.0 / 180.0) * M_PI], nil];

[theLayer addAnimation:animation forKey:@"transform.rotation.z"];
4

2 に答える 2

1

theLayer.transformまたはを使用theLayer.affineTransformして(アニメーションの前に)現在の変換行列を取得し、iPhone sdk CGAffineTransform を使用してオブジェクトの回転角度を取得し、開始角度を取得します。

于 2010-02-02T16:01:52.073 に答える
0

この回答で提供するようなコードを使用して、アニメーションの設定に使用する開始角度を取得できます。

CATransform3D rotationTransform = [theLayer transform];
float angle;
if (rotationTransform.m11 < 0.0f)
        angle = 180.0f - (asin(rotationTransform.m12) * 180.0f / M_PI);
else
        angle = asin(rotationTransform.m12) * 180.0f / M_PI;

または、ここで提案されているより単純なヘルパーキーパスメソッドを使用します。

float currentAngle = ([[theLayer valueForKeyPath:@"transform.rotation.z"] floatValue] * 180.0f / M_PI);

このアニメーションをすでに進行中のアニメーションに追加する場合は、レイヤーを直接クエリするのではなく、レイヤーのプレゼンテーションレイヤーの現在の角度をクエリする必要があります。CALayerのpresentationLayerは、アニメーションの途中でレイヤーの現在の状態を反映します。

于 2010-02-02T19:33:02.933 に答える