强制更新子视图控制器的 safeAreaInsets

Posted

技术标签:

【中文标题】强制更新子视图控制器的 safeAreaInsets【英文标题】:Force update of child view controller's safeAreaInsets 【发布时间】:2018-07-06 16:35:51 【问题描述】:

我有一个 rootViewController,它有一个子视图控制器 (fullScreenViewController),其视图不时显示在 上方 @987654327 的视图(但作为子视图) @,占据全屏。

rootViewController.addChildViewController( fullScreenViewController ) rootViewController.view.addSubview( fullScreenViewController.view )

这个“全屏演示”是通过约束更新完成的,不是使用present()(这是有充分理由的)。

当我第一次初始化fullScreenViewController 并将其添加为rootViewController 的子视图控制器,然后更新约束使其显示在屏幕上时,safeAreaInsets 都已正确设置。

但是,稍后,当我的rootViewController 实际使用present() 模态VC,并且该VC 是dismiss()ed 时,fullScreenViewController 上的safeAreaInsets 不再正确,并且中的内容fullScreenViewController 在状态栏顶部向上滑动。

如何强制正确重新计算fullScreenViewController 上的safeAreaInsets,以便它们与设置后的rootViewController 匹配?

根据文档,rootViewController 应该在其所有childViewControllers 上正确设置 safeAreaInsets,但似乎并非如此。

【问题讨论】:

我有完全相同的问题,在容器视图控制器上方显示模态框会弄乱孩子的安全区域插图。您在哪里可以找到此问题的原因或解决方法? 【参考方案1】:

在演示文稿更改安全区域后,子视图控制器的 safeAreaInsets 没有正确刷新,我遇到了完全相同的问题。

我发现问题已通过将子视图设为父视图的直接子视图来解决,而之前它是子视图的子视图。当子 VC 的视图是父级的直接子视图时,我猜 UIKit 代码会更快乐。

如果您可以将视图层次结构重构为这种配置(如果还没有的话),这可能会做到。

【讨论】:

我最终重构了我的大部分视图层次结构,其中的一些东西为我修复了它。我将不得不使用您的解决方案,看看这是否是我遇到的特定问题。不过看起来很有希望;很高兴你把它修好了!

以上是关于强制更新子视图控制器的 safeAreaInsets的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 中的 safeAreaInsets 问题

从 .xib 强制更新显示视图控制器

UIPageViewController 强制重新加载 ChildView 控制器

vue 强制刷新子组件

强制更新离屏 UICollectionView

如何在父组件中强制刷新子组件