web-dev-qa-db-fra.com

Comment puis-je changer le style d'animation d'un UIViewController modal?

J'affiche actuellement un UIViewController comme celui-ci:

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

et le cacher comme ça:

[self.navigationController dismissModalViewControllerAnimated:YES];

L'animation est "glisser vers le bas" ... puis glisser vers le bas. Comment puis-je changer le style d'animation? Puis-je le faire fondre in/out?

À votre santé!

69
MrDatabase

Marcus Zarra a publié une excellente solution à cela sur la liste de diffusion du 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];

Il existe des transitions pour le retournement et le curling de page. Si vous êtes déterminé sur la décoloration, vous pouvez essayer d'ajuster l'alpha de votre nouvelle vue:

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];

Cependant, ce que vous voulez probablement, c'est un fondu enchaîné, ou du moins un fondu enchaîné. Lorsque l'UINavigationController bascule vers une nouvelle vue, il supprime l'ancienne. Pour cet effet, vous feriez probablement mieux d'ajouter simplement une nouvelle vue à votre UIViewController existant et de fondre son alpha au fil du temps.

Remarque: Si vous n'êtes pas dans votre application, le délégué [auto-fenêtre] ne fonctionnera pas. Utilisez self.view.window, grâce au message de user412500 pour l'avoir signalé.

60
Ben Gottlieb

Pour iPhone 3.0+, un fondu enchaîné de base est plus facile à faire comme ceci:

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

Pour mettre à jour la décoloration alpha dans 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;}];
8
Peter DeWeese

CA devrait etre [self.view.window] pour que le code fonctionne

(au moins c'est comme ça dans iOS 3.2)

2
user412500