2012-10-03 25 views
16

En mi proyecto xcode tengo un UIImage. Quiero hacerlo un poco tembloroso (animación) de izquierda a derecha. Escribí este código, sin embargo, no funciona.Cómo hacer animación "temblorosa"

-(void)errorShake 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:1.0]; 



    [lockImage setTransform:CGAffineTransformMakeRotation(-5 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(-10 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(-15 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(-20 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(-15 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(-10 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(-5 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(0 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(5 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(10 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(15 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(20 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(15 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(10 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(5 * M_PI/180.0)]; 
    [lockImage setTransform:CGAffineTransformMakeRotation(0 * M_PI/180.0)]; 


    [UIView commitAnimations]; 
} 

¿Podría decirme por favor, cómo puedo hacer que mi imagen se sacuda?

Respuesta

45

Aquí está el código que uso para ese efecto.

-(void)shakeView { 

     CABasicAnimation *shake = [CABasicAnimation animationWithKeyPath:@"position"]; 
     [shake setDuration:0.1]; 
     [shake setRepeatCount:2]; 
     [shake setAutoreverses:YES]; 
     [shake setFromValue:[NSValue valueWithCGPoint: 
           CGPointMake(lockImage.center.x - 5,lockImage.center.y)]]; 
     [shake setToValue:[NSValue valueWithCGPoint: 
           CGPointMake(lockImage.center.x + 5, lockImage.center.y)]]; 
     [lockImage.layer addAnimation:shake forKey:@"position"]; 
    } 

Como Jere mencionado. Asegúrese de incluir la importación:

#import <QuartzCore/QuartzCore.h> 

También puede añadirlo como una categoría en UIView.

+0

¡Gracias! Pero, ¿necesito agregar algún framework/biblioteca al proyecto? Xcode da un error debido a la primera línea. – SmartTree

+2

¡agregue el marco 'QuartzCore' a su proyecto! y también agregue '#import ' en el archivo que desea usar la animación, o mejor aún en el archivo de encabezado del prefijo de aplicaciones para que pueda verlo desde cualquier clase. – jere

+0

¡Maravilloso! Y una pregunta más: ¿qué es [self center]? – SmartTree

11

brynbodayles answer también funciona en iOS8 para una animación de movimiento en tiempo récord.

Con Importación de QuartzCore:

func shakeView(){ 
    var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") 
    shake.duration = 0.1 
    shake.repeatCount = 2 
    shake.autoreverses = true 

    var from_point:CGPoint = CGPointMake(LoginField.center.x - 5, LoginField.center.y) 
    var from_value:NSValue = NSValue(CGPoint: from_point) 

    var to_point:CGPoint = CGPointMake(LoginField.center.x + 5, LoginField.center.y) 
    var to_value:NSValue = NSValue(CGPoint: to_point) 

    shake.fromValue = from_value 
    shake.toValue = to_value 
    LoginField.layer.addAnimation(shake, forKey: "position") 
} 
+0

Cómo detener esta animación mientras se repite el movimiento –

-1

De Corona respuesta

Dale animación batido en múltiples botones y también en vistas SWIFT3

para la animación de vista simplemente cambiar la extensión UIButton a la extensión UIView

extension UIButton 
{ 
    func shakeAnim() 
    { 
     let shake:CABasicAnimation = CABasicAnimation(keyPath: "position") 
     shake.duration = 0.1 
     shake.repeatCount = 2 
     shake.autoreverses = true 

     let from_point:CGPoint = CGPoint(x:self.center.x - 5,y: self.center.y) 
     let from_value:NSValue = NSValue(cgPoint: from_point) 

     let to_point:CGPoint = CGPoint(x:self.center.x + 5,y: self.center.y) 
     let to_value:NSValue = NSValue(cgPoint: to_point) 

     shake.fromValue = from_value 
     shake.toValue = to_value 
     self.layer.add(shake, forKey: "position") 
    } 
} 
Cuestiones relacionadas