Анимация Вращающийся UIImageView - PullRequest
11 голосов
/ 27 августа 2010

Я хочу повернуть UIImageView примерно на 10 градусов влево / вправо, но у меня плавная анимация, а не внезапный поворот, который я вижу, используя:

player.transform = CGAffineTransformMakeRotation(angle)

Любая помощь приветствуется, спасибо.

Ответы [ 5 ]

14 голосов
/ 01 мая 2011
[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));
11 голосов
/ 27 августа 2010

Я использую некоторый код, подобный этому, для достижения аналогичного эффекта (хотя я поворачиваю его на 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"];

Я использую код, очень похожий на этот, для вращения изображения.

2 голосов
/ 02 декабря 2013

у меня есть какой-то код поворота на 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];

}

ЕслиВы хотите повернуть изображение uiimage примерно на 10 градусов влево / вправо: [self rotateImage:imgView duration:0.7 delay:0.0 curve:UIViewAnimationCurveEaseIn rotations:(M_PI/18)]; похоже, некоторая задержка

1 голос
/ 06 марта 2018

конвертировано для 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")
0 голосов
/ 30 июня 2016

Современное решение 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) углом поворота, чтобы получить желаемые результаты.Этот набор переменных работал для меня.

...