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

Posted

技术标签:

【中文标题】带有dismissViewControllerAnimated的iOS 8错误:完成:动画?【英文标题】:iOS 8 bug with dismissViewControllerAnimated: completion: animation? 【发布时间】:2015-02-17 15:41:03 【问题描述】:

dismissViewControllerAnimated:completion:ios 文档状态:

如果你连续呈现几个视图控制器,从而构建一个 呈现的视图控制器堆栈,在视图上调用此方法 堆栈中较低的控制器关闭其直接子视图 控制器和堆栈上该子级上方的所有视图控制器。 发生这种情况时,只有最顶层的视图会在动画中消失 时尚;任何中间视图控制器都被简单地从 堆。最顶层的视图使用其模态转换被关闭 样式,可能与其他视图控制器使用的样式不同 在堆栈中较低。

这意味着当使用一次关闭两个模态视图控制器时

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

显示的动画应该是被关闭的顶部模态视图。

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

【问题讨论】:

你的意思是最顶部的视图在动画开始时突然消失了吗? 我很确定这是一个错误。如果您执行返回多个控制器的展开转场,也会发生这种情况(如果我没记错的话,在这种情况下,您确实会看到顶视图消失,但也会短暂地看到倒数第二个控制器)。 是否向 Apple 提交了错误报告?我不知道该怎么做或如何检查。 我在 unwind segue 上下文中看到了完全相同的问题。帮助会很棒。 【参考方案1】:

如上所述:我在展开的 segue 上下文中看到了完全相同的问题。我只是使用屏幕截图按照此处所述的解决方法,并将其作为子视图添加到所有中间视图控制器: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;
    

【讨论】:

【参考方案2】:

与@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)

【讨论】:

以上是关于带有dismissViewControllerAnimated的iOS 8错误:完成:动画?的主要内容,如果未能解决你的问题,请参考以下文章

带有和不带有聚合的 sql 查询

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢

访问控制允许带有和不带有 www 的来源