简体   繁体   中英

Animate Rotating UIImageView

I want to rotate a UIImageView by roughly 10 degrees left/right but have a smooth animation, rather than a sudden turn which I see using:

player.transform = CGAffineTransformMakeRotation(angle)

Any help appreciated, thanks.

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25]; // Set how long your animation goes for
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

player.transform = CGAffineTransformMakeRotation(angle); // if angle is in radians

// if you want to use degrees instead of radians add the following above your @implementation
// #define degreesToRadians(x)(x * M_PI / 180)
// and change the above code to: player.transform = CGAffineTransformMakeRotation(degreesToRadians(angle));

[UIView commitAnimations];

// The rotation code above will rotate your object to the angle and not rotate beyond that.
// If you want to rotate the object again but continue from the current angle, use this instead:
// player.transform = CGAffineTransformRotate(player.transform, degreesToRadians(angle));

I use some code like this to achieve a similar effect (though I rotate it by 360 degrees):

CABasicAnimation *rotate;
rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rotate.fromValue = [NSNumber numberWithFloat:0];
rotate.toValue = [NSNumber numberWithFloat:deg2rad(10)];
rotate.duration = 0.25;
rotate.repeatCount = 1;
[self.view.layer addAnimation:rotate forKey:@"10"];

I use code very similar to this to spin an image view.

i have some code rotate 360 degrees:

  - (void) runSpinAnimationOnView:(UIView*)view duration:(CGFloat)duration rotations:(CGFloat)rotations repeat:(float)repeat;
{
    CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: rotations * 2.0 /* full rotation*/ * rotations * duration ];
    rotationAnimation.duration = duration;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = repeat;
    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

call it: [self runSpinAnimationOnView:imgView duration:0.1 rotations:M_PI_4 repeat:10];

And animation rotate some degrees and again:

    - (void)rotateImage:(UIImageView *)image duration:(NSTimeInterval)duration delay:(NSTimeInterval)delay
              curve:(int)curve rotations:(CGFloat)rotations
{
    [UIView animateWithDuration:duration
                          delay:delay
                        options:0
                     animations:^{
                         [UIView setAnimationCurve:curve];
                         image.transform = CGAffineTransformMakeRotation(rotations);

                     }
                     completion:^(BOOL finished){
                         [self rotateImage2:image duration:duration delay:delay curve:curve rotations:rotations];
                         ;
                     }];
    [UIView commitAnimations];

}
- (void)rotateImage2:(UIImageView *)image duration:(NSTimeInterval)duration delay:(NSTimeInterval)delay
               curve:(int)curve rotations:(CGFloat)rotations
{
    [UIView animateWithDuration:duration
                          delay:delay
                        options:0
                     animations:^{
                         [UIView setAnimationCurve:curve];
                         image.transform = CGAffineTransformMakeRotation(-rotations);
                     }
                     completion:^(BOOL finished){
                         [self rotateImage:image duration:duration delay:delay curve:curve rotations:rotations];
                         ;
                     }];
    [UIView commitAnimations];

}

If you want to rotate a uiimageview by roughly 10 degrees left/right call : [self rotateImage:imgView duration:0.7 delay:0.0 curve:UIViewAnimationCurveEaseIn rotations:(M_PI/18)]; similar, some degress

Converted for Swift 3/4:

let animation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0
animation.toValue =  Double.pi * 2.0
animation.duration = 2
animation.repeatCount = .infinity
animation.isRemovedOnCompletion = false

imageView.layer.add(animation, forKey: "spin")

A modern Swift solution, using NSTimer and CGAffineTransformMakeRotation :

class Rotation: UIViewController {
    var timer = NSTimer()
    var rotAngle: CGFloat = 0.0

    @IBOutlet weak var rotationImage: UIImageView!

    override func viewDidLoad() {
      super.viewDidLoad()
      activateTimer()
    }

    func activateTimer() {
      //(1)
      timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target:self, selector:#selector(Rotation.updateCounter), userInfo: nil, repeats: true) 
    }

    func updateCounter() {
      //(2)
      var rotateLeft: Bool = true
      if rotateLeft {
        rotAngle -= 30.0
      } else {
        rotAngle += 30.0
      }
      //(3)
      UIView.animateWithDuration(2.0, animations: {
        self.rotationImage.transform = CGAffineTransformMakeRotation((self.rotAngle * CGFloat(M_PI)) / 180.0)
      })
    }
}

Things to notice:

  • Connect the outlet the the UIImageView

  • Play with the (1)timer pace, (2)animation pace and (3)rotation angle to get the desired results. This set of variables worked for me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM