UIModalPresentationCurrentContext with Transition?
Asked Answered
C

3

10

I am trying to modal present a view controller like below:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"addPopover"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:vc animated:YES];

Now using UIModalPresentationCurrentContext means I can present this view with a transparent background and see my other view behind the new one. However, it stops me from being able to present it with a transition.

Any ideas why? Or how I can get around this? Thanks.

Crocus answered 4/10, 2012 at 21:37 Comment(2)
What is the presentation style of the ViewController you are presenting from?Bellamy
@bbodayle, I'm having the same issue, and I've tried all the presentation styles/combinations on both ViewControllers.Duckweed
A
11

Full screen modals aren't supposed to allow you to see the under layer. Annoying I know.

From your code I'm assuming that "addPopover" is actually a full screen view, where you have your content as a subsection while the rest is transparent.

Try this:

vc.modalPresentationStyle = UIModalPresentationCurrentContext;
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:vc animated:YES completion:NULL];

Note: I'd recommend adding a low alpha background color to let the user know that they can't interact with the rest of the view when you pop this over top...

Ardellardella answered 18/10, 2012 at 14:44 Comment(5)
What's different here? Setting modalTransitionStyle on the target view didn't make any difference and neither did using presentViewController over presentModalViewController.Duckweed
assigning the transition style to vc instead of self, and using presentViewController method. Without seeing your storyboard it's hard to diagnose if this doesn't work. With the above method, your overlaid VC needs to be the same size as "self" (or be able resizing)Ardellardella
Yes, in my project, both ViewControllers are the same size. I tried your code and there was no change. The property setting modalPresentationStyle = UIModalPresentationCurrentContext needs to be applied to self here, not vc. I guess I will have to start my own question instead of offering bounty on this one because there is no solution here, even though it's marked as one.Duckweed
Link it here and I'll try to check it out. Sorry this didn't help you.Ardellardella
But 'PresentingViewController' (View controller that presents new view controller) wont get rotated. Is there any way to do that?Thermocouple
K
25

I was able to accomplish this by setting modalPresentationStyle = UIModalPresentationCurrentContext on the rootViewController of my UIWindow, IF I haven't presented any new full screen viewControllers on top of this rootViewController. I did something like this:

UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:YES completion:nil];

I've tried this with both a UINavigationController as my window's rootViewController and various other custom view controllers. It seems as long as the window's rootViewController knows what's going on, any sub-viewControllers can call presentViewController:animated:completion: without blacking-out the underlying view.

However, let's say you present another viewController on top of your window's rootViewController. And this new viewController is presented with modalPresentationStyle = UIModalPresentationFullScreen (ie. takes up the screen), then you have to call modalPresentationStyle = UIModalPresentationCurrentContext on that top-most viewController.

So to recap:

  • If you have UINavigationController -> UIViewController(s) (they could be pushed and popped in and out), then you set modalPresentationStyle = UIModalPresentationCurrentContext on the UINavigationController.
  • If you have UINavigationController -> UIViewController -> new-UIViewController (with modalPresentationStyle set to UIModalPresentationFullScreen), then you set modalPresentationStyle = UIModalPresentationCurrentContext on the new-UIViewController.

Hopefully this works for you guys as well!

Kaete answered 26/10, 2012 at 1:9 Comment(6)
This worked for me. The key was setting the modalPresentationStyle on the presenting view controller, not the view controller being presented.Discontinuous
What if you are presenting it on a UISplitViewController?Urticaceous
I'm getting a blackout background as soon as the animation finished. I'm second view controller on a stack (on top of course) of a UINavigationController I've tried setting modalPresentationStyle = UIModalPresentationCurrentContext on the vc to appear, self, self.navigationController and even appDelegate.window.rootViewController to no avail. Obviously I'm missing something though, any ideas?Hummock
Another problem with this approach is that the hole rotation breaks.Romina
hey it's works but i have another issue with rotation. parent viewcontroller is not rotating according to modal viewcontroller rotationPooi
This is not working for me in iOS 7. iOS 8 its fine.Alveraalverez
A
11

Full screen modals aren't supposed to allow you to see the under layer. Annoying I know.

From your code I'm assuming that "addPopover" is actually a full screen view, where you have your content as a subsection while the rest is transparent.

Try this:

vc.modalPresentationStyle = UIModalPresentationCurrentContext;
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:vc animated:YES completion:NULL];

Note: I'd recommend adding a low alpha background color to let the user know that they can't interact with the rest of the view when you pop this over top...

Ardellardella answered 18/10, 2012 at 14:44 Comment(5)
What's different here? Setting modalTransitionStyle on the target view didn't make any difference and neither did using presentViewController over presentModalViewController.Duckweed
assigning the transition style to vc instead of self, and using presentViewController method. Without seeing your storyboard it's hard to diagnose if this doesn't work. With the above method, your overlaid VC needs to be the same size as "self" (or be able resizing)Ardellardella
Yes, in my project, both ViewControllers are the same size. I tried your code and there was no change. The property setting modalPresentationStyle = UIModalPresentationCurrentContext needs to be applied to self here, not vc. I guess I will have to start my own question instead of offering bounty on this one because there is no solution here, even though it's marked as one.Duckweed
Link it here and I'll try to check it out. Sorry this didn't help you.Ardellardella
But 'PresentingViewController' (View controller that presents new view controller) wont get rotated. Is there any way to do that?Thermocouple
T
0

Mr. T's suggestions worked nearly perfectly, you just lose the transition animation on the presented viewcontroller

Since it is also setting the appDelegates rootviewController's presentation style, it will also remove the transition animations for any views presented from that point.

My fix was to return the AppDelegates rootViewController's presentation style back to it's default whenever the viewcontroller is closed that I needed the transparent background on

I have a button that dismisses the presentedViewController, in that I also set the presentation style of the rootViewController back to default using:

    UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
    rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

I hope that helps anyone else getting stumped on this problem.

Tolland answered 2/3, 2014 at 0:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.