落ちるコインを作ろうとしています。コインの画像は、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"];
回転アニメーションのdeletedOnCompletionプロパティをNOに設定しましたか。
rota.removedOnCompletion = NO;
これにより、アニメーションが終了したときのプレゼンテーションレイヤーが残ります。デフォルトはYESで、モデル値、つまりユーザーが記述した動作に戻ります。
FillModeも設定する必要があります。つまり、
rota.fillMode = kCAFillModeForwards;
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呼び出しは必要ありません。
私はそれを設定することによって見つけました:removedOnCompletion = NO;
計器で目に見えるリークは発生しませんでしたが、割り当てが解除されず、少量のメモリが蓄積されていました。 IDKが私の実装であるかどうかはわかりますが、アニメーションの最後にremoveAllAnimationsを追加することで、このわずかな残りのメモリをクリアしたようです。
[myview.layer removeAllAnimations];