带有dismissViewControllerAnimated的iOS 8错误:完成:动画?

时间:2015-02-17 15:41:04

标签: ios uiviewcontroller ios8 modalviewcontroller

dismissViewControllerAnimated:completion:州的iOS文档:

  

如果你连续出现几个视图控制器,那么建立一个   堆栈的呈现视图控制器,在视图上调用此方法   堆栈中较低的控制器会解除其直接的子视图   控制器和堆栈上该子节点上方的所有视图控制器。   发生这种情况时,只有最顶层的视图在动画中被解除   时尚;任何中间视图控制器都可以从中删除   堆。最顶层的视图使用其模态转换被忽略   样式,可能与其他视图控制器使用的样式不同   在堆栈中较低。

这意味着使用

一次解除两个模态视图控制器

[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil];

显示的动画应该是被解雇的顶级模态视图。

在iOS 7和之前的情况确实如此,但在iOS 8中,所显示的动画并不是最顶级的视图(根据我的经验,它是第二个最顶层的视图)。这种行为是iOS 8中的错误还是我做错了什么?

2 个答案:

答案 0 :(得分:3)

如上所述:我在展开segue上下文中看到完全相同的问题。我只是使用屏幕截图来解决此处所述的解决方法,并将其作为子视图添加到所有中间viewControllers:How to dismiss a stack of modal view controllers with animation without flashing on screen any of the presented VCs between the top and bottom?

    // this in during unwind in a custom UIStoryboardSegue (that is the reason why it might look wrong with what is what: srcViewController and destViewController
    UIViewController* aPresentedViewController = destViewController.presentedViewController;
    while (aPresentedViewController != nil) {
        if (aPresentedViewController == srcViewController) {
            break;
        }
        UIView *anotherSrcViewCopy = [srcViewController.view snapshotViewAfterScreenUpdates: NO];
        anotherSrcViewCopy.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [aPresentedViewController.view addSubview:anotherSrcViewCopy];
        // recurse through the presentedViewController hierarchy
        aPresentedViewController = aPresentedViewController.presentedViewController;
    }

答案 1 :(得分:1)

与@theguy相同的问题和相同的解决方案。 这是我在Swift中的版本,没有在所有视图控制器上进行迭代:

guard
    let presentedViewController = segue.destination.presentedViewController,
    let viewToCopy              = segue.source.view.snapshotView(afterScreenUpdates: false)
else { return }

viewToCopy.autoresizingMask = [.flexibleWidth, .flexibleHeight]
presentedViewController.view.addSubview(viewToCopy)