How can I change the animation style of a modal UIViewController?

IphoneCocoa Touch

Iphone Problem Overview


I'm currently displaying a UIViewController like this:

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

and hiding it like this:

[self.navigationController dismissModalViewControllerAnimated:YES];

The animation is "slide up from the bottom"... then slide back down. How can I change the animation style? Can I made it fade in/out?

Cheers!

Iphone Solutions


Solution 1 - Iphone

For iPhone 3.0+, a basic crossfade is easiest to do like this:

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

Solution 2 - Iphone

Marcus Zarra posted a great solution to this on the SDK mailing list:

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

There are transitions for flipping and page-curling. If you are set on fading, can try adjusting your new view's alpha:

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

However, what you probably want is a crossfade, or at least a fade-over. When the UINavigationController switches to a new view, it removes the old one. For this effect, you're probably better off just adding a new view to your existing UIViewController and fading its alpha in over time.

Note: If you are not in your app delegate [self window] will not work. Use self.view.window , thanks to user412500's post for pointing this out.

Solution 3 - Iphone

To update for alpha fading in 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;}];

Solution 4 - Iphone

It should be [self.view.window] in order for the code to work

(at least that's the way that it is in ios 3.2)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMrDatabaseView Question on Stackoverflow
Solution 1 - IphoneSimo SalminenView Answer on Stackoverflow
Solution 2 - IphoneBen GottliebView Answer on Stackoverflow
Solution 3 - IphonePeter DeWeeseView Answer on Stackoverflow
Solution 4 - Iphoneuser412500View Answer on Stackoverflow