UIContainerView 中的 ChildViewController 在初始加载时高度错误

Posted

技术标签:

【中文标题】UIContainerView 中的 ChildViewController 在初始加载时高度错误【英文标题】:ChildViewController in UIContainerView has wrong height on initial load 【发布时间】:2019-02-14 14:34:47 【问题描述】:

我有一个 ViewController,它的内容位于视图的顶部三分之一,然后一个 UIContainerView 位于视图底部的三分之二。 UIContainerView 允许用户在三个 childViewController 之间旋转。使用 AutoLayout,我将 UIContainerView 限制在屏幕两侧 (widthAnchor)、屏幕底部 (bottomAnchor) 和屏幕上方三分之二处 (topAnchor)。

在第一个 childViewController 中布局内容时,它出现在父 ViewController 的初始加载中,我遇到了困难。似乎在初始加载时,childViewController 视图的 view.frame.height 等于设备的高度。我设置了约束来处理这个问题,第一个屏幕显示正常。

我现在遇到的问题是,当我在 childViewControllers 中旋转时,view.frame.height 被设置为 ContainerView 的高度(我从一开始就怀疑是这种情况)。这会导致第一个 childViewController 中的约束“中断”。

看看下面的这种行为。

图片#1:ParentViewController 的初始加载。

https://roryent.box.com/s/xhil4wk0ga5qoddhko5jxj3a1r4103h3

图片 #2:切换 childViewController。

https://roryent.box.com/s/9f2jj0l1waui3ekyplq4eae51m6wrqn5

图片#3:回到最初的 childViewController。约束“起作用”,但对不同的 view.frame.height 做出反应。

https://roryent.box.com/s/cj9ffyy3m9oh8f523l2vsdezo1frk12x

注意:我正在 ChildViewController 类中创建约束并尝试使用该 childViewController 框架的框架来执行此操作。

我试图将约束项目的方法移动到 childViewController 中的 willLayoutSubviews() 中,而没有任何变化。

我怀疑我加载不同项目的位置有问题。

我希望 childViewController 代码中使用的 self.view.frame.height 反映正在显示它的 UIContainerView 的高度。在我的情况下,高度应该是 .67 * UIScreen.Main.Bounds.Height。

【问题讨论】:

这听起来完全不对。要进行测试,请创建一个新的UIViewController。按住 Ctrl 键从您的 UIContainerView 拖动到新的 VC 并选择“嵌入”。您的新 VC 应立即更改为容器视图的大小。将 4 个标签添加到新 VC,并将它们约束到 4 个角(左上、右上、左下、右下)。运行应用程序,查看 4 个标签是否按预期显示在容器视图的 4 个角中。 【参考方案1】:

我认为问题是由于我实现了 ContainerView 及其相应的 childViewControllers。

我已经按照本教程重建了该功能,并且没有遇到任何问题。 https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

【讨论】:

以上是关于UIContainerView 中的 ChildViewController 在初始加载时高度错误的主要内容,如果未能解决你的问题,请参考以下文章

UIContainerView 内容高度(内嵌 UITableViewController)

UINavigationViewController 控件 UIContainerView 嵌入 segue

如何将数据传递给嵌套控制器(UIContainerView)?

无法将 UIContainerView 添加到 UIScrollView

奇怪的 UIContainerView 自动布局旋转行为

在 UIViewController 中嵌入 UIContainerView 作为屏幕的一部分