10

これは単純なはずですがUIImageView、完全に360度回転して、永遠に繰り返されるのに問題があります。

[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では、正の値は時計回りの回転を指定し、負の値は反時計回りの回転を指定します。

4

4 に答える 4

14

クリストフはすでに正しい方向に進んでいますが、終了するたびにアニメーションデリゲートで再起動せずに、回転を維持するためのはるかに優れた方法があります。これは単に間違っています。

アニメーションの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"];

ドキュメントに記載されているように、これによりアニメーションが永久に繰り返されます。

于 2012-05-08T18:12:06.533 に答える
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

回転させ続ける。また、程度と期間のパラメーターは非常に大きな数値になる可能性があります...これで十分な場合.

更新:
yinkouが述べたように、

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

デリゲートでアニメーションを再開するよりもはるかに優れています。

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

于 2012-05-08T14:50:13.513 に答える
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 で失敗する意味のある説明が見つかりませんでした。

于 2012-05-08T07:54:58.800 に答える
1

このための UIImageView カテゴリを作成しました: https://gist.github.com/alexhajdu/5658543

使用するだけです:

[_myImageView rotate360WithDuration:1.0 repeatCount:0]; //0 for infinite loop 
于 2013-05-27T21:04:52.530 に答える