使用动画推送视图控制器会冻结 UI

Posted

技术标签:

【中文标题】使用动画推送视图控制器会冻结 UI【英文标题】:Pushing a view controller with animation freezes UI 【发布时间】:2018-05-24 00:00:07 【问题描述】:

我试图多次推送同一类型的视图控制器,如果我在推送中使用动画,则 UI 在 pushController 之后冻结。

示例:我在一个 ProductController 中,我对另一个 ProductController 执行 pushViewController,然后 UI 冻结。

Xcode 显示以下错误: *"[Snapshotting] Snapshotting a view (0x7fdd9a5bdba0, UIView) that has not been rendered at least once requires afterScreenUpdates:YES."*

为了避免 UI 冻结,我必须设置 pushController 动画:false。

self.navigationController?.pushViewController(productController, animated: false)

有解决这个问题的想法吗?

【问题讨论】:

显示实际导致您的问题的代码。请务必提供足够的详细信息。 【参考方案1】:

你想知道为什么这段代码不起作用吗?

self.navigationController?.pushViewController(productController, animated: true)
self.navigationController?.popViewController(animated: true)

如果您使用animated = true,该函数将在下一次通过应用程序事件循环时将推送视图控制器的操作排入队列。它不会立即发生。

然后,在下一行中,您要求弹出视图控制器,即使它还没有开始推送它。

tl;博士:

不要那样做。

然而,更重要的问题是为什么你会推送然后立即弹出视图控制器?好像没什么意义。

【讨论】:

我编辑了问题以正确解释问题。在 ProductController 中,我必须使用动画 = false 对另一个 ProductController 执行 pushController,否则 UI 会冻结。如果使用动画 = true 将 ProductController 的 popController 执行到另一个 ProductController,则会发生相同的冻结。

以上是关于使用动画推送视图控制器会冻结 UI的主要内容,如果未能解决你的问题,请参考以下文章

在动画推送和弹出时,导航项中带有搜索栏的连续视图控制器会导致视图模糊[重复]

ios performSelector:withObject:afterDelay: in viewDidLoad 冻结视图推送

iOS - 从导航控制器推送时应用程序冻结

带有向下滑动动画的自定义推送视图控制器

推送 UIViewController

在自定义视图控制器转换中抑制导航推送动画