¿Cómo puedo cambiar el estilo de animación de un UIViewController modal?

Actualmente estoy mostrando un UIViewController como este:

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

y escondiéndolo así:

 [self.navigationController dismissModalViewControllerAnimated:YES]; 

La animación es “deslizar hacia arriba desde la parte inferior” … y luego deslizar hacia abajo. ¿Cómo puedo cambiar el estilo de animación? ¿Puedo hacerlo fundido de entrada / salida?

¡Aclamaciones!

Marcus Zarra publicó una gran solución para esto en la lista de correo del 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 voltear y curvar páginas. Si está configurado para desvanecerse, puede intentar ajustar el alfa de su 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 probablemente desee es un fundido cruzado, o al menos un desvanecimiento. 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.

Para iPhone 3.0+, un fundido cruzado básico es más fácil de hacer así:

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

Para actualizar el desvanecimiento alfa 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;}]; 

Debería ser [self.view.window] para que el código funcione

(al menos esa es la forma en que está en ios 3.2)