iOS8 - 呈现模态视图会删除子视图

时间:2014-09-16 15:05:00

标签: ios uiview ios8 modalviewcontroller

我正在使用xcode6 / iOS8更新我们的应用程序。

我遇到的一个问题是当出现模态视图时。基础子视图已删除。它完全被涂黑了..直到模态视图被解除..然后它重新出现。

iOS8有没有遇到过这种情况?自iOS4以来,相同的代码已经有效。

代码:

    PigDetailViewController *pigDetailViewController = [[PigDetailViewController alloc] initWithNibName:@"PigDetailViewController" bundle:nil];

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    self.navigationController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;


    [self presentViewController:pigDetailViewController animated:YES completion:nil];

3 个答案:

答案 0 :(得分:3)

在iOS 8中,他们添加了一种新的演示风格,其行为类似于您所描述的环境中的UIModalPresentationCurrentContext,它是UIModalPresentationOverCurrentContext。这里的问题是与UIModalPresentationCurrentContext不同,您希望使用此演示文稿样式将视图控制器设置为PRESENTED,如下所示:

PigDetailViewController *pigDetailViewController = [[PigDetailViewController alloc] initWithNibName:@"PigDetailViewController" bundle:nil];
pigDetailViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
self.navigationController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:pigDetailViewController animated:YES completion:nil];

请注意,要支持iOS 7及更低版本,您可能需要检查操作系统版本,并根据该版本决定如何呈现视图控制器。

编辑:我想再补充一点。在带有UIModalPresentationCurrentContext的iOS7中,当呈现的VC被解除时,底层VC的viewDidAppear方法被调用。在带有UIModalPresentationOverCurrentContext的iOS8中,我发现当底层的VC被解除时,底层VC没有调用它的viewDidAppear方法。

答案 1 :(得分:0)

在BrennanR的回答中添加一个观点..甚至viewWillAppear也不会在VC顶部的VC被解雇时调用。

答案 2 :(得分:-1)

我认为您误解了模式视图控制器的工作原理。

当您以模态方式呈现视图控制器时,它将控制整个屏幕。它有一个不透明的背景(通常是黑色),然后在其上面绘制视图。

因此,如果将view.backgroundColor设置为黄色(例如),它将具有黄色背景。如果将其设置为清除,则它将显示为黑色背景。

我认为你想要的是另一个视图“透视”,所以看起来模态视图就在它上面。

我发现这样做的最好方法是使用这种方法......

// in the view controller that is presenting the modal VC
modalVC = // the modal VC that you will be presenting

UIView *snapshotView = [self.view snapshotViewAfterScreenUpdates:NO];
[modalVC.view insertSubView:snapshotView atIndex:0];

// present the modal VC

这将获取当前视图层次结构的“屏幕截图”,然后将该快照放在模态VC中的所有内容之下。

这样,您的黑屏将被前一个视图控制器的屏幕截图所取代。