2012-10-03 13 views
16

Nel mio progetto xcode ho un UIImage. Voglio farlo tremare (animazione) da sinistra a destra un po '. Ho scritto questo codice, tuttavia, non funziona.Come rendere l'animazione "shaking"

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

Potrebbe dirmi per favore, come posso far tremare la mia immagine?

risposta

45

Ecco il codice che uso per quell'effetto.

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

Come Jere menzionato. Assicurati di includere l'importazione:

#import <QuartzCore/QuartzCore.h> 

È inoltre possibile aggiungere come una categoria a UIView.

+0

Grazie! Ma devo aggiungere qualche framework/libreria al progetto? Xcode dà un errore a causa della prima riga. – SmartTree

+2

aggiungi la struttura 'QuartzCore' al tuo progetto! e aggiungi anche "#import " nel file che vuoi utilizzare per l'animazione, o meglio ancora nel file di intestazione del prefisso delle app in modo da poterlo vedere da qualsiasi classe. – jere

+0

Meraviglioso! E un'altra domanda: che cosa è [centro di sé]? – SmartTree

11

risposta brynbodayles funziona anche con iOS8 per un'animazione shake in rapido.

Con Importazione di 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

Come interrompere l'animazione tra una pausa e l'altra mentre si sta ripetendo –

-1

Da Corona risposta

Dare animazione scossa in più pulsanti e anche in vista SWIFT3

per animazione vista basta cambiare estensione UIButton all'estensione 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") 
    } 
}