こんにちは。開発担当のICTFです。
[UIView animateWithDuration:0.2 animations:^(void) {}];
を使って360°の回転アニメーションを作る場合、素直に書くと次のようになります。
[UIView animateWithDuration:0.2 animations:^(void) {
CGAffineTransform positiveRotate = CGAffineTransformMakeRotation(360 * (M_PI / 180.0));
view.transform = positiveRotate;
}];
ですがこのコードを動かすと、実際はまったく動かないのをご存知でしょうか。
360°はつまり0°と同じですので、最初から目的の度数であると判断される為です。
この現象を回避するため、また回転の方向を制御する為に90°の回転アニメーションを4回に分けて行なうなど面倒な処理が必要になります。
animateWithDuration: animations:で実装に苦労する360°回転処理ですが、実はCABasicAnimationを使う事で比較的簡単に実装ができます。
CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat:(M_PI / 180) * 360];
rotationAnimation.duration = 30.0f;
rotationAnimation.repeatCount = HUGE_VALF;
[view.layer addAnimation:rotationAnimation forKey:@"rotateAnimation"];
toValueに回転する度数を、durationにアニメーションが完了するまでの時間を、repeatCountに繰り返す回数を設定します。
HUGE_VALFを設定する事で無制限の繰り返しにする事も可能です。
上記コードでは時計回りに回転しますが、反時計回りにしたい場合はtoValueにマイナスの値を設定して下さい。
CABasicAnimationを使う際の注意点ですが、画面の切り替わりやアプリの切り替わりでアニメーションがクリアされます。
画面を戻した時に継続してアニメーションを行ないたい場合、viewWillAppear:やapplicationWillEnterForeground:がコールされるタイミングで再度アニメーションの設定を行なう必要があります。
コメントする