6

.png形式のホイール画像があります。連続的に回転するようにアニメーション化する方法を知りたいのですが、stackoverflowを検索して、画像を回転させるのに役立つ特定のコードスニペットを見つけましたが、連続的に回転しません。数秒間回転して停止するだけで、コードは次のようになります

viewdidloadのコード

UIImageView *imageToMove =
[[UIImageView alloc] initWithImage:[UIImageimageNamed:@"horo_circle.png"]];
[self.view addSubview:imageToMove];

[self rotateImage:imageToMove duration:5.0 
            curve:UIViewAnimationCurveEaseIn degrees:180];

とアニメーション

- (void)rotateImage:(UIImageView *)image duration:(NSTimeInterval)duration 
          curve:(int)curve degrees:(CGFloat)degrees
{
    // Setup the animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:duration];
    [UIView setAnimationCurve:curve];
    [UIView setAnimationBeginsFromCurrentState:YES];

    // The transform matrix
    CGAffineTransform transform = 
    CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degrees));
    image.transform = transform;

    // Commit the changes
    [UIView commitAnimations];
}

インポート後の次の行

#define M_PI   3.14159265358979323846264338327950288   /* pi */

#define DEGREES_TO_RADIANS(angle) (angle / 180.0 * M_PI)
4

5 に答える 5

49

あなたは:でこれを行う方が良いですCABasicAnimation

if ([self.spinnerOverlay animationForKey:@"SpinAnimation"] == nil) {
    CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    animation.fromValue = [NSNumber numberWithFloat:0.0f];
    animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
    animation.duration = 10.0f;
    animation.repeatCount = INFINITY;
    [self.spinnerOverlay.layer addAnimation:animation forKey:@"SpinAnimation"];
}

このコードでは、アニメーションがすべて準備ができているかどうかを確認します。再度設定する必要はありません。あなたのspinnerOverlay場合、UIImageViewあなたは回転したいです。

アニメーションを停止するには:

  [self.spinnerOverlay.layer removeAnimationForKey:@"SpinAnimation"];
于 2012-11-08T14:54:42.073 に答える
3

次のコードは、rotate == NOになるまで、 iconViewと呼ばれるUIImageViewを継続的に回転させます。

画像は常に元の位置に戻ります。

- (void)performRotationAnimated
{
    [UIView animateWithDuration:0.5
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^{

                         self.iconView.transform = CGAffineTransformMakeRotation(M_PI);
                     }
                     completion:^(BOOL finished){

                         [UIView animateWithDuration:0.5
                                               delay:0
                                             options:UIViewAnimationOptionCurveLinear
                                          animations:^{

                                              self.iconView.transform = CGAffineTransformMakeRotation(0);
                                          }
                                          completion:^(BOOL finished){

                                              if (_rotate) {

                                                  [self performRotationAnimated];
                                              }
                                          }];
                     }];
}

これは同じテーマのバリエーションです。

(合計時間:2 * 0.5 =スピンの場合は1秒)

魔法のように機能します!

于 2015-05-27T23:37:26.410 に答える
2

タイマーを使ってそれを行う別の方法があります。viewController.hファイルで、タイマーと画像を宣言する必要があります。

@interface ViewController : UIViewController

{

    IBOutlet UIImageView *spinningImage;

    NSTimer *spinTimer;

}

次に、ViewController.mでこのコードを追加し、時間間隔を短くするか、変換間隔を長くすることで、スピンを高速化できます。

-(void) viewDidLoad {
    spinTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target: self selector:@selector(spinVoid) userInfo:nil repeats:YES];
}

-(void) spinVoid {

    spinningImage.transform = CGAffineTransformRotate(spinningImage.transform, 0.001);

}

お役に立てれば!

于 2016-05-03T22:51:19.863 に答える
1

iOS6に移行したので、従来の方法ではなく、ブロックベースのアニメーション(iOS 4.0以降で使用可能)に切り替えることを検討してください。これを試して:

[UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationOptionRepeat animations:^{

image.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degrees));

    } completion:nil];
于 2012-11-08T14:53:20.327 に答える
-1

アニメーション用に選択した方法を使用する:

 [UIView setAnimationRepeatCount:10000000];

UIViewAnimationOptionRepeatまたは、 blocksメソッドでフラグを指定できますanimateWithDuration:delay:options:animations:completion:

于 2012-11-08T14:54:34.020 に答える