2011-06-13 31 views
5

que tienen el código simple de:¿Cómo espero hasta que finalice una animación en una clase diferente antes de continuar?

[otherClass doMethodOneWhichHasAnimation]; 

y que la animación tiene una duración de 0,8 segundos. Seguido del código que empuja un viewcontroller:

SchemeView *schemeView = [[SchemeView alloc] init]; 
    [self.navigationController pushViewController:schemeView animated:YES]; 
    [schemeView release]; 

El problema es, empuja el viewcontroller sin esperar, y me gustaría que esperar. Hacer demoras solo lo demora todo, incluida la primera animación desde el inicio.

¿Cómo puedo esperar a que transcurran los 0,8 segundos antes de ejecutar el segundo bit de código?

Respuesta

14

Usted puede empujar después de la animación se realiza

[UIView animateWithDuration:0.8 
     animations:^{ 
      // Animation 
     } 
     completion:^(BOOL finished){ 

      // PushView 

     }]; 

para < iOS 4 o echar un vistazo a setAnimationDidStopSelector

o

[self performSelector:@selector(metohodToPushView) withObject:nil afterDelay:0.8]; 
14

Puede utilizar CATransaction para ejecutar un bloque de terminación después de cualquier animación, sin cambiar el código fuente del método que crea la animación. Tendrá que llamar al link with the QuartzCore framework y necesitará #import <QuartzCore/QuartzCore.h>. A continuación, puede hacer esto:

[CATransaction begin]; { 

    [CATransaction setCompletionBlock:^{ 
     // This block runs after any animations created before the call to 
     // [CATransaction commit] below. Specifically, if 
     // doMethodOneWhichHasAnimation starts any animations, this block 
     // will not run until those animations are finished. 

     SchemeView *schemeView = [[SchemeView alloc] init]; 
      [self.navigationController pushViewController:schemeView animated:YES]; 
      [schemeView release]; 
    }]; 

    // You don't need to modify `doMethodOneWhichHasAnimation`. Its animations are 
    // automatically part of the current transaction. 
    [otherClass doMethodOneWhichHasAnimation]; 

} [CATransaction commit]; 
+0

Me encantaría que esto funcione, pero no funciona para mi uso (que es llevar a cabo el desplazamiento de una fila después de cualquier actualización de la vista de tabla animada). –

+0

@ StianHøiland Intenta enviar 'layoutIfNeeded' a tu vista de tabla dentro de la transacción (donde mi ejemplo envía' doMethodOneWhichHasAnimation'). –

+0

Desafortunadamente no hay suerte. –

0

He solucionado este problema creando una nueva clase para ejecutar animaciones.

Esta clase cuenta la cantidad de tiempo transcurrido sincronizado con el inicio de la animación.

Usted alimenta en el momento de la animación a la clase y tanto el bloque de animación y el contador de la clase lleva ese número en.

Cuando el contador ha llegado a su fin usted sabe que la animación también ha terminado.

... Todo sin bibliotecas complicadas al azar.

-2

simplemente llamar a un método con el intervalo de tiempo retardado

como-

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.00]; 
+1

Esta respuesta es muy incorrecta. Solo estás preguntando por las condiciones de carrera aquí. –

Cuestiones relacionadas