web-dev-qa-db-ja.com

CABasicAnimationを使用してCALayerを回転した後、レイヤーは回転していない位置に戻ります

落ちるコインを作ろうとしています。コインの画像は、2つのCABasicAnimationsが付いたCALayerです。つまり、落下と回転です。落下するアニメーションが終了しても、そのまま残ります。ただし、回転アニメーションはランダムで毎回異なる角度になることになっていますが、元のCALAyerの画像に戻ります。

アニメが終わった角度に留めておきたいです。出来ますか?どうすればいいのですか?

コード:

//Moving down animation:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
anim.duration = 1;
anim.autoreverses = NO;
anim.removedOnCompletion = YES;

anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)];
anim.toValue = [NSNumber numberWithInt: 0];

//Rotation Animation:
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rota.duration = 4;
rota.autoreverses = NO;
rota.removedOnCompletion = NO;
rota.fromValue = [NSNumber numberWithFloat: 0];
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ];
[cl addAnimation: rota forKey: @"rotation"];
[cl addAnimation: anim forKey: @"animateFalling"];
39
Mikle

回転アニメーションのdeletedOnCompletionプロパティをNOに設定しましたか。

rota.removedOnCompletion = NO;

これにより、アニメーションが終了したときのプレゼンテーションレイヤーが残ります。デフォルトはYESで、モデル値、つまりユーザーが記述した動作に戻ります。

FillModeも設定する必要があります。つまり、

rota.fillMode = kCAFillModeForwards;
79
Allan Bazinet

Twitter/Facebookの「Pull to Refresh」効果のように、矢印を前後に回転させようとしていました。

問題は、同じUIViewで前後にローテーションを行っていたため、追加した後

rotation.removedOnCompletion = NO;
rotation.fillMode = kCAFillModeForwards;

順方向のアニメーション戦争は機能しましたが、逆方向のアニメーションはまったく機能しませんでした。

したがって、yeahdixonによって提案された最後の行を追加し、さらにビューの変換をアニメーションの完了状態に設定します(180度回転)。

[myview.layer removeAllAnimations];
myView.transform = CGAffineTransformMakeRotation(M_PI);

「復元」アニメーション(逆方向)の場合、完了時にこれを行います。

myView.transform = CGAffineTransformMakeRotation(0);

...そしてそれはうまくいきます。どういうわけか、removeAllAnimations呼び出しは必要ありません。

4
Nicolas Miari

私はそれを設定することによって見つけました:removedOnCompletion = NO;

計器で目に見えるリークは発生しませんでしたが、割り当てが解除されず、少量のメモリが蓄積されていました。 IDKが私の実装であるかどうかはわかりますが、アニメーションの最後にremoveAllAnimationsを追加することで、このわずかな残りのメモリをクリアしたようです。

[myview.layer removeAllAnimations];
1
yeahdixon