【问题标题】:Animate Rotating UIImageView动画旋转 UIImageView
【发布时间】:2010-08-27 19:46:50
【问题描述】:

我想将UIImageView 向左/向右旋转大约 10 度,但动画很流畅,而不是我看到的突然转弯:

player.transform = CGAffineTransformMakeRotation(angle)

【问题讨论】:

    标签: iphone animation uiimageview rotation


    【解决方案1】:
    [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));
    

    【讨论】:

      【解决方案2】:

      我使用一些这样的代码来实现类似的效果(虽然我将它旋转了 360 度):

      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"];
      

      我使用与此非常相似的代码来旋转图像视图。

      【讨论】:

      • 旋转角度是否需要使用弧度值?我第一次使用它,说没有声明 deg2rad,这是什么?也没有声明 CABasicAnimation。
      • 是的,你需要弧度值; deg2rad 只是将 10 度转换为弧度的占位符。
      【解决方案3】:

      转换为 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")
      

      【讨论】:

        【解决方案4】:

        我有一些代码可以旋转 360 度:

          - (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"];
        }
        

        叫它:[self runSpinAnimationOnView:imgView duration:0.1 rotations:M_PI_4 repeat:10];

        并且动画会一次又一次地旋转一些度数:

            - (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];
        
        }
        

        如果您想将 uiimageview 向左/向右旋转大约 10 度 致电:[self rotateImage:imgView duration:0.7 delay:0.0 curve:UIViewAnimationCurveEaseIn rotations:(M_PI/18)]; 类似,有所下降

        【讨论】:

          【解决方案5】:

          现代的Swift 解决方案,使用NSTimer 和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)
                })
              }
          }
          

          注意事项:

          • 连接插座UIImageView

          • 使用 (1) 计时器速度、(2) 动画速度和 (3) 旋转角度来获得所需的结果。这组变量对我有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-03
            相关资源
            最近更新 更多