2010-08-27 16 views
11

quiero girar una UIImageView por aproximadamente 10 grados a la izquierda/derecha, pero tienen una animación suave, en lugar de un giro repentino cual veo usando:Animate giratoria UIImageView

player.transform = CGAffineTransformMakeRotation(angle) 

Cualquier ayuda apreciada, gracias.

Respuesta

11

Consumo código como este para lograr un efecto similar (aunque girarla 360 grados):

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

que use el código muy similar a este para hacer girar una vista de la imagen.

+0

¿Es necesario usar un valor en radianes del ángulo de giro? La primera vez que lo he usado, dice que deg2rad no ha sido declarado, ¿qué es esto? también que CABasicAnimation no declarado. –

+0

sí, necesitas el valor de radian; deg2rad es solo un marcador de posición para convertir tus 10 grados en radianes. – 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, me encantaron los comentarios adicionales. – eladleb

2

tengo algo de código girar 360 grados:

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

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

y animación girar algunos grados y otra vez:

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

} 

Si desea girar un uiimageview por aproximadamente 10 grados a la izquierda/derecha llamada: [self rotateImage:imgView duration:0.7 delay:0.0 curve:UIViewAnimationCurveEaseIn rotations:(M_PI/18)]; similares, algunos Degress

0

Una solución moderna Swift, utilizando NSTimer y 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) 
     }) 
    } 
} 

cosas a destacar:

  • conectar la salida del la UIImageView

  • Juego con el (1) ritmo del temporizador, (2) ritmo de animación y (3) r ángulo de otación para obtener los resultados deseados. Este conjunto de variables funcionó para mí.

0

convertido para 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")