2012-05-24 10 views
6

Estoy descartando un controlador de vista modal y presentando inmediatamente otro controlador de vista modal, pero actualmente no puedo usar la animación en ambos, el segundo.¿Cómo demorar entre 2 animaciones?

¿Hay alguna manera de retrasar el proceso para que el usuario experimente ambas animaciones?

El código siguiente funciona actualmente sin embargo, el usuario sólo ve la segunda animación, obviamente:

// First one configure 
detailViewController.modalPresentationStyle = UIModalPresentationFullScreen; 
detailViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentModalViewController:detailViewController animated:YES]; 

//Dismiss first one 
[self dismissModalViewControllerAnimated:NO]; 

//Immediately configure and show second one 
navController.modalPresentationStyle = UIModalPresentationFormSheet; 
navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:navController animated:YES]; 
+0

puedo asumir que usted ha intentado ya ' [auto dismissModalViewControllerAnimated: SÍ];' sin ¿¿éxito?? –

+0

[UIView transitionWithView: duración de mysuperview: 0,75 opciones: animaciones UIViewAnimationTransitionFlipFromRight:^{[self dismissModalViewControllerAnimated: NO]; } finalización: nada] –

Respuesta

9

Ahora hay un bloque de compleción disponible en el controlador de vista modal presente. Vea esto LINK. Esto está disponible en iOS5.0 +.

Esto tiene la ventaja de que no necesita estimar el retardo del temporizador si tuviera que usar una solución de temporizador.

Sólo hay que poner el código para su segunda animación en el bloque:

//Block safe reference to self to prevent retain cycles 
__block typeof (self) selfReference = self; 

// First one configure 
detailViewController.modalPresentationStyle = UIModalPresentationFullScreen; 
detailViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentModalViewController:detailViewController animated:YES completion: 
^{ 
    //Dismiss first one 
    [selfReference dismissModalViewControllerAnimated:NO]; 

    //Immediately configure and show second one 
    navController.modalPresentationStyle = UIModalPresentationFormSheet; 
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [selfReference presentModalViewController:navController animated:YES]; 
}]; 
+2

Esta es la solución correcta. Intentar utilizar un temporizador para adivinar cuándo ha terminado de animarse su primer controlador de vista es un truco. – jnic

+0

+1 Para uno de los mejores enfoques – Mat

+0

¡Esto es excelente! Las dos animaciones se ven increíbles juntas, gracias amigo, y la primera vez que utilizas bloques, ¡muy útiles! – TheLearner

1

Hacer un selector que hace lo siguiente:

- (void)showSecondModalVC { 
    //Dismiss first one 
    [self dismissModalViewControllerAnimated:NO]; 

    //Immediately configure and show second one 
    navController.modalPresentationStyle = UIModalPresentationFormSheet; 
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:navController animated:YES]; 
} 

un después en la pieza principal de código:

// First one configure 
detailViewController.modalPresentationStyle = UIModalPresentationFullScreen; 
detailViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentModalViewController:detailViewController animated:YES]; 

[self performSelector:@selector(showSecondModalVC) 
     withObject:nil 
     afterDelay:0.5f]; 

Tendrás que mirar de cerca y ver cuánto se necesita para el primer modal para mostrar para que las animaciones se vean bien.

1

usted puede hacerlo en cualquier otro estilo.

detailViewController.modalPresentationStyle = UIModalPresentationFullScreen; 
detailViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentModalViewController:detailViewController animated:YES]; 

[self dismissModalViewControllerAnimated:NO]; 

[self performSelector:@selector(someFunction) withObject:nil afterDelay:1.0]; 

- (void) someFunction{ 
//Immediately configure and show second one 
navController.modalPresentationStyle = UIModalPresentationFormSheet; 
navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:navController animated:YES]; 

}

1

Pruebe con esto:

// First one configure 
detailViewController.modalPresentationStyle = UIModalPresentationFullScreen; 
detailViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentModalViewController:detailViewController animated:YES]; 

//Dismiss first one 
[self dismissModalViewControllerAnimated:NO]; 
NSTimer Timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(openSecondView) userInfo:nil repeats:NO]; 


-(void)openSecondView 
{ 
    //Immediately configure and show second one 
    navController.modalPresentationStyle = UIModalPresentationFormSheet; 
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:navController animated:YES]; 
} 

Codificación feliz ...