2011-10-17 4 views
6

Come è possibile eseguire un CABasicAnimation dopo che l'altro è terminato? In altre parole sequenzialmente. Ho aggiunto il tempo della seconda animazione iniziare, tuttavia sembra che la seconda animazione non viene eseguito:in esecuzione CABasicAnimation in sequenza

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    appearance.duration = 0.5; 
    appearance.fromValue = [NSNumber numberWithFloat:0]; 
    appearance.toValue = [NSNumber numberWithFloat:340]; 
    appearance.repeatCount = 1; 
    appearance.fillMode = kCAFillModeForwards; 
    appearance.removedOnCompletion = NO; 
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; 



    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    theAnimation.duration = 0.5; 
    theAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    theAnimation.toValue = [NSNumber numberWithFloat:10]; 
    theAnimation.repeatCount = 3; 
    theAnimation.autoreverses = YES; 
    theAnimation.fillMode = kCAFillModeForwards; 
    theAnimation.removedOnCompletion = NO; 
    theAnimation.beginTime = appearance.beginTime + appearance.duration; 
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; 

Qualsiasi idea del perché?

risposta

15

Codice aggiornato, funzionerà!

prima animazione

CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    [appearance setValue:@"animation1" forKey:@"id"]; 
    appearance.delegate = self; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)]; 
    appearance.duration = 0.5; 
    appearance.fromValue = [NSNumber numberWithFloat:0]; 
    appearance.toValue = [NSNumber numberWithFloat:340]; 
    appearance.repeatCount = 1; 
    appearance.fillMode = kCAFillModeForwards; 
    appearance.removedOnCompletion = NO; 
    [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; 

secondo Animazione:

- (void)animationDidStop:(CAAnimation *)theAnimation2 finished:(BOOL)flag { 
    if([[theAnimation2 valueForKey:@"id"] isEqual:@"animation1"]) { 
    CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
    theAnimation.duration = 0.5; 
    theAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    theAnimation.toValue = [NSNumber numberWithFloat:10]; 
    theAnimation.repeatCount = 3; 
    theAnimation.autoreverses = YES; 
    theAnimation.fillMode = kCAFillModeForwards; 
    theAnimation.removedOnCompletion = NO; 
    theAnimation.beginTime = appearance.beginTime + appearance.duration; 
    [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; 
} 

}

Questo è come il secondo di animazione avrebbe sparato dopo il 1 ° uno finisce.

+0

questo non ha funzionato ..the animationDidStop è stato chiamato infinitamente – adit

+0

hai copiato entrambi i pezzi di codice? Non sono la stessa cosa. –

+0

Se hai un ciclo, sei sicuro di non aver impostato il delegato della seconda animazione in modo che anche la seconda animazione stia chiamando animationDidStop? – isaac

1

La cosa più semplice da fare è impostare un delegato per la prima animazione e in quell'oggetto implementare -animationDidStop:finished:. In questo metodo, tocca la seconda animazione.

+0

no non ha funzionato – adit

1

Il motivo per cui l'animazione non è in esecuzione in base al piano è dovuta al modo in cui è stata codificata l'animazione core Core & utilizzata. Le animazioni core sono tutte alimentate tramite GPU. CA infatti gestisce molto bene un paio di cose per rendere le animazioni in modo ottimale.

Un elemento di questo è la potenza di elaborazione parallela delle moderne schede grafiche, e un altro è il fatto che Core Animation può memorizzare nella cache il contenuto di un CALayer sulla scheda in modo che il codice non debba ridisegnarlo costantemente. Questo, tra l'altro, è parte del motivo per cui l'interfaccia utente di iPhone è incredibilmente veloce su un hardware relativamente modesto. Core Animation può sfruttare automaticamente un Mac multi-core perché l'albero dei livelli viene reso su un thread separato.

L'ultima riga è imp. CA sono in esecuzione in un thread separato (& non il thread principale). Quindi, tornando al tuo problema, hai 2 blocchi di CA ciascuno cercando di animare lo stesso transform.translation.y Entrambi allo stesso tempo! Come funzionerebbe?

Quindi, per risolvere questo problema, sia do -

  1. Che qualcuno ha suggerito, mettere un ritardo per la seconda animazione in modo che dopo i primi Animates, secondo calci nel solo dopo che il primo sistema operativo sopra.
  2. o Prova a eseguire l'intera animazione in un unico blocco (di nuovo come suggerito da qualcuno).

Volevo solo evidenziare il ragionamento della teoria & dietro il modo in cui Core Animation funziona. Spero che questo aiuti ...

0

Il modo più semplice e pulito è quello di utilizzare un CAAnimationGroup. Dai un'occhiata a questa risposta - mi ha aiutato.

Chaining Core Animation animations

+3

'CAAnimationGroup' è per animazioni concomitanti, non sequenziali, in genere per l'animazione di più proprietà. – Barry