2012-05-08 13 views
10

これは簡単ですが、UIImageViewを360度回転させて永遠に繰り返すのに問題があります。UIImageViewを時計回りに回す

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{ 
    self.reloadButton.imageView.transform = CGAffineTransformRotate(self.reloadButton.imageView.transform, -M_PI); 
} completion:^(BOOL finished) { 

}]; 

ドキュメントによれば、私はCGAffineTransformRotateに渡す角の符号の有無は、回転の方向を決定するが、上記のコードは、反時計回りに回転します。 M_PIと同じです。

この行列が座標軸を回転させる角度(ラジアン単位) システム軸。 iOSでは、正の値が反時計回りに 回転を指定し、負の値で時計回りの回転を指定します。 Mac OSの Xでは、正の値は時計回りの回転を指定し、負の値 は反時計回りの回転を指定します。

+0

あなたはCATransform3DとimageViews層の上に回転を行う場合はどうなりますか? –

+0

他の角度(たとえば180度)で回転してみましたか? – giorashc

+0

@David提案していただきありがとうございますが、これは同じ結果をもたらしました:self.reloadButton.imageView.layer.transform = CATransform3DMakeRotation(-M_PI、0、0、1); – Morrowless

答えて

14

Christophはすでに正しい方法で行っていますが、終了するたびにアニメーション代理人にそれを再呼び出しせずに回転させておく方がはるかに優れています。これは単に間違っています。

アニメーションのrepeatCountプロパティをHUGE_VALFに設定するだけです。

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = @0.0f; 
animation.toValue = @(2*M_PI); 
animation.duration = 0.5f;    // this might be too fast 
animation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"]; 

たように、これはアニメーションが永遠に繰り返されることになります、in the documentation述べました。

+1

私は270度で十分だったので、それについては本当に考えていませんでした。繰り返し回数を設定する方が良い方法ですが、それに応じて変更します。 – Christoph

+1

コードをありがとう!大変うまくいっています。 – eric

+0

何かをインポートするのではなく、 'CGFLOAT_MAX'を使ってください。 –

1

申し訳逃した最初の部分は、ビューは小さい角度を使用してうまく回転:

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     redView.transform = CGAffineTransformRotate(redView.transform, M_PI_2); 
    } completion:^(BOOL finished) { 

    }]; 

それはM_PIで失敗し、なぜ私は意味のある説明を見つけることができませんでした。

+0

繰り返しは私が欲しいものですが、問題は時計回りに回転していないことです。 – Morrowless

+0

私はその回転の最終状態は元の状態と同じであると思うので – giorashc

1

少し前に同じ問題が発生しました。 私はその問題の原因を覚えていないが、これは私のソリューションです:

/** 
* Incrementally rotated the arrow view by a given angle. 
* 
* @param degrees Angle in degrees. 
* @param duration Duration of the rotation animation. 
*/ 
- (void)rotateArrowViewByAngle:(CGFloat)degrees 
        withDuration:(NSTimeInterval)duration { 

    CABasicAnimation *spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    spinAnimation.fromValue = [NSNumber numberWithFloat:self.currentAngle/180.0 * M_PI]; 
    spinAnimation.toValue = [NSNumber numberWithFloat:degrees/180.0 * M_PI]; 
    spinAnimation.duration = duration; 
    spinAnimation.cumulative = YES; 
    spinAnimation.additive = YES; 
    spinAnimation.removedOnCompletion = NO; 
    spinAnimation.delegate = self; 
    spinAnimation.fillMode = kCAFillModeForwards; 

    [self.arrowView.layer addAnimation:spinAnimation forKey:@"spinAnimation"]; 

    self.currentAngle = degrees; 
} 

、その後、あなたが回転し、それを維持回転させるようにデリゲートメソッド

- (void)animationDidStart:(CAAnimation *)theAnimation 
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 

を使用することができます。 また、degreeとdurationのパラメータは本当に高い数値になる可能性があります。これで十分です。

UPDATE:
yinkou、

spinAnimation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 

で述べたように、デリゲートでアニメーションを再起動する方法をお勧めします。

ご注意:
self.currentAngleは、現在の最終回転を記憶するプロパティです。
私はビューを左右に回転させる必要がありました。

関連する問題