2008-10-26 14 views
69

estoy Actualmente exhibiendo un UIViewController así:¿Cómo puedo cambiar el estilo de animación de un UIViewController modal?

[[self navigationController] presentModalViewController:modalViewController animated:YES]; 

y ocultando de esta manera:

[self.navigationController dismissModalViewControllerAnimated:YES]; 

La animación es "deslice hacia arriba desde el fondo" ... a continuación, deslice hacia abajo. ¿Cómo puedo cambiar el estilo de animación? ¿Puedo hacerlo fundido de entrada/salida?

¡Salud!

Respuesta

60

Marcus Zarra anotó una gran solución a este en la lista de correo SDK:

UIViewController *controller = [[[MyViewController alloc] init] autorelease]; 
UIViewAnimationTransition trans = UIViewAnimationTransitionCurlUp; 
[UIView beginAnimations: nil context: nil]; 
[UIView setAnimationTransition: trans forView: [self window] cache: YES]; 
[navController presentModalViewController: controller animated: NO]; 
[UIView commitAnimations]; 

Hay transiciones para mover de un tirón y la página-curling. Si se fijan en la decoloración, puede intentar ajustar el alfa de la nueva vista:

UIViewController *controller = [[[MyViewController alloc] init] autorelease]; 
controller.view.alpha = 0.0; 
[navController presentModalViewController: controller animated: NO]; 
[UIView beginAnimations: nil context: nil]; 
controller.view.alpha = 1.0; 
[UIView commitAnimations]; 

Sin embargo, lo que es probable que desee es un fundido cruzado, o por lo menos un fundido de más. Cuando UINavigationController cambia a una nueva vista, elimina la anterior. Para este efecto, probablemente sea mejor simplemente agregar una nueva vista a su UIViewController existente y desvanecer su alfa con el tiempo.

Nota: Si no está en su aplicación, el delegado [ventana propia] no funcionará. Utilice self.view.window, gracias a la publicación de user412500 para señalar esto.

+5

Esto es viejo! ¡Vea la respuesta de Simo Salminen a continuación! MrDatabase deberías cambiar esto –

194

para el iPhone 3.0+, un fundido cruzado básica es más fácil de hacerlo de esta manera:

modalViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[[self navigationController] presentModalViewController:modalViewController 
               animated:YES]; 
+2

¡Funciona a la perfección! Me tomó un par de segundos darme cuenta de que la transición debe aplicarse al viewController que se está presentando y no a sí mismo. – looneydoodle

+0

Puede hacer esto en Interface Builder, agregando una transición modal y estableciendo la transición a 'Cross Dissolve', por ejemplo. – paulvs

2

Debe ser [self.view.window] para que el código funcione

(al menos esa es la forma que es en iOS 3.2)

8

para actualizar para alpha decoloración en iOS 4:

modalController.view.alpha = 0.0; 
[self.view.window.rootViewController presentModalViewController:modalController animated:NO]; 
[UIView animateWithDuration:0.5 
       animations:^{modalController.view.alpha = 1.0;}]; 
+1

Esto funcionó muy bien para mí. – zekel

Cuestiones relacionadas