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!