2009-11-11 14 views
6

Sto provando a vibrare/scuotere un elemento dell'interfaccia utente, vale a dire un controllo, come se fosse stato colpito, ed è in risonanza. Posso utilizzare Core Animation scuoterlo verticalmente, orizzontalmente o in entrambe, da un pixel:Il modo migliore per vibrare un elemento dell'interfaccia utente?

CABasicAnimation* rotationXAnimation; 
rotationXAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"]; 
rotationXAnimation.fromValue = [NSNumber numberWithFloat: ((UIControl *) sender).center.y-1.0 ]; 
rotationXAnimation.toValue = [NSNumber numberWithFloat: ((UIControl *) sender).center.y+1.0 ]; 
rotationXAnimation.duration = 0.2; 
rotationXAnimation.cumulative = NO; 
rotationXAnimation.repeatCount = 10.0; 
rotationXAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[((UIControl *) sender).layer addAnimation:rotationXAnimation forKey:@"upDownAnimation"]; 

O posso rotazione da un piccolo arco avanti e indietro attorno all'asse z (-M_PI * 0,02 e M_PI * 0.02) :

CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.fromValue = [NSNumber numberWithFloat: -M_PI * 0.02 ]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 0.02 ]; 
rotationAnimation.duration = 0.2; 
rotationAnimation.cumulative = NO; 
rotationAnimation.repeatCount = 10.0; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[((UIControl *) sender).layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Nessuno di questi sembra così piacevole. Qualcuno ha delle buone alternative? Vorrei soprattutto apprezzare le idee di keyPath da provare.

Grazie!

Aggiornamento:

Di seguito, dove sono contraenti ed espandere il controllo, è meglio, ma sto ancora cercando altre idee.

CABasicAnimation* scaleAnimation; 
scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
scaleAnimation.fromValue = [NSNumber numberWithFloat: 0.95 ]; 
scaleAnimation.toValue = [NSNumber numberWithFloat: +1.05 ]; 
scaleAnimation.duration = 0.1; 
scaleAnimation.cumulative = NO; 
scaleAnimation.repeatCount = 10.0; 
scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[((UIControl *) sender).layer addAnimation:scaleAnimation forKey:@"scaleAnimation"]; 

risposta

6

sto tremando uno dei miei Input-Vista dopo un input dell'utente sbagliato utilizzando:

- (void)earthquake:(UIView*)itemView 
{ 
    CGFloat t = 2.0; 
    CGAffineTransform leftQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, t, -t); 
    CGAffineTransform rightQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, -t, t); 

    itemView.transform = leftQuake; // starting point 

    [UIView beginAnimations:@"earthquake" context:itemView]; 
    [UIView setAnimationRepeatAutoreverses:YES]; // important 
    [UIView setAnimationRepeatCount:4]; 
    [UIView setAnimationDuration:0.07]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(earthquakeEnded:finished:context:)]; 

    itemView.transform = rightQuake; // end here & auto-reverse 

    [UIView commitAnimations]; 
} 

- (void)earthquakeEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    if ([finished boolValue]) 
    { 
     UIView* item = (UIView *)context; 
     item.transform = CGAffineTransformIdentity; 
    } 
} 

Questo sembra del tutto naturale, ho ottenuto questo codice da alcuni internet-thread che Non riesco a ricordare.

4

È possibile utilizzare un'animazione di fotogrammi chiave sulla posizione del livello. Questo è soggettivo, naturalmente, perché non sono sicuro di ciò che consideri "gradito". L'animazione di scuotimento che si ottiene quando si immette la password di OS X in modo errato Ho duplicato utilizzando Core Animation in questo blog post on Cocoa Is My Girlfriend. Non sono sicuro se questo è ciò che stai andando, ma questa è un'alternativa.

Con i migliori saluti,

+0

questo è solo in una direzione - side-to-side - giusto? – mahboudz

+0

Sì. Ma puoi creare un'animazione di fotogrammi chiave che utilizza un percorso nello stesso modo che anima il campo "posizione" che è un punto di partenza. –

2

un aggiornamento di Bersaelor's bella risposta scossa poco qui per utilizzare UIView animazioni di blocco, invece, alcune persone non sempre sanno è possibile utilizzare auto-reverse e ripetere-conta in questi:

self.transform = CGAffineTransformMakeTranslation(2.0, -2.0); 
[UIView animateWithDuration:0.07 
         delay:0.0 
        options:UIViewAnimationOptionAutoreverse 
       animations:^{ 
        UIView.animationRepeatCount = 4; 
        self.transform = CGAffineTransformMakeTranslation(-2.0, 2.0); 
       } 
       completion:^(BOOL finished){ 
        self.transform = CGAffineTransformIdentity; 
       }]; 
Problemi correlati