dismissViewControllerAnimated:completion:
州的iOS文档:
如果你连续出现几个视图控制器,那么建立一个 堆栈的呈现视图控制器,在视图上调用此方法 堆栈中较低的控制器会解除其直接的子视图 控制器和堆栈上该子节点上方的所有视图控制器。 发生这种情况时,只有最顶层的视图在动画中被解除 时尚;任何中间视图控制器都可以从中删除 堆。最顶层的视图使用其模态转换被忽略 样式,可能与其他视图控制器使用的样式不同 在堆栈中较低。
这意味着使用
一次解除两个模态视图控制器 [[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil];
显示的动画应该是被解雇的顶级模态视图。
在iOS 7和之前的情况确实如此,但在iOS 8中,所显示的动画并不是最顶级的视图(根据我的经验,它是第二个最顶层的视图)。这种行为是iOS 8中的错误还是我做错了什么?
答案 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)