2010-08-27 3 views
11

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

player.transform = CGAffineTransformMakeRotation(angle) 

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

ответ

11

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

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

+0

мне нужно использовать радианы значения угла поворота ли? Впервые я использовал его, говорит deg2rad, не объявленный, что это? также, что CABasicAnimation не объявлено. –

+0

Да, вам нужно значение радиана; deg2rad - это просто место для преобразования ваших 10 градусов в радианы. – jer

14
[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)); 
+3

+1, любил дополнительные комментарии. – eladleb

2

У меня есть некоторый код вращаться на 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)]; похожи, некоторые град

0

Современный 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

  • Play с темпом (1) таймера, (2) темпом анимации и (3) r чтобы получить желаемые результаты. Этот набор переменных работал для меня.

0

Старинный для 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") 
Смежные вопросы