10

我正在尝试模态显示如下视图控制器:

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

现在使用UIModalPresentationCurrentContext意味着我可以用透明背景呈现这个视图,并在新视图后面看到我的另一个视图。但是,它使我无法通过过渡来呈现它。

任何想法为什么?或者我该如何解决这个问题?谢谢。

4

3 回答 3

25

我可以通过设置modalPresentationStyle = UIModalPresentationCurrentContext我的 UIWindow 的 rootViewController 来实现这一点,如果我没有在这个 rootViewController 之上呈现任何新的全屏 viewControllers。我做了这样的事情:

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

我已经尝试使用 UINavigationController 作为我的窗口的 rootViewController 和各种其他自定义视图控制器。似乎只要窗口的 rootViewController 知道发生了什么,任何子视图控制器都可以调用presentViewController:animated:completion:而不会使底层视图变黑。

但是,假设您在窗口的 rootViewController 之上展示了另一个 viewController。并且这个新的 viewController 被呈现modalPresentationStyle = UIModalPresentationFullScreen(即占据屏幕),然后你必须调用modalPresentationStyle = UIModalPresentationCurrentContext最顶层的 viewController。

回顾一下:

  • 如果您有 UINavigationController -> UIViewController(s)(它们可以被推入和弹出),那么您modalPresentationStyle = UIModalPresentationCurrentContext在 UINavigationController 上进行设置。
  • 如果你有 UINavigationController -> UIViewController -> new-UIViewController(modalPresentationStyle 设置为 UIModalPresentationFullScreen),那么你modalPresentationStyle = UIModalPresentationCurrentContext在 new-UIViewController 上进行设置。

希望这也适用于你们!

于 2012-10-26T01:09:57.397 回答
11

全屏模式不应该让您看到底层。烦人我知道。

从您的代码中,我假设“addPopover”实际上是一个全屏视图,您将内容作为一个小节,而其余部分是透明的。

尝试这个:

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

注意:我建议添加低 alpha 背景颜色,让用户知道当您将其弹出到顶部时,他们无法与视图的其余部分进行交互...

于 2012-10-18T14:44:44.593 回答
0

T先生的建议几乎完美,你只是失去了呈现的视图控制器上的过渡动画

由于它还设置了 appDelegates rootviewController 的呈现样式,它还将删除从该点呈现的任何视图的过渡动画。

我的解决方法是在我需要透明背景的 viewcontroller 关闭时将 AppDelegates rootViewController 的演示样式恢复为默认值

我有一个关闭presentedViewController的按钮,我还使用以下方法将rootViewController的演示样式设置回默认值:

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

我希望这可以帮助其他人在这个问题上遇到困难。

于 2014-03-02T00:21:22.377 回答