当父容器视图约束以编程方式更改时,UINavigationController 子视图不调整大小

Posted

技术标签:

【中文标题】当父容器视图约束以编程方式更改时,UINavigationController 子视图不调整大小【英文标题】:UINavigationController child view not adjusting size when parent container view constraint changed programmatically 【发布时间】:2014-06-03 00:24:42 【问题描述】:

我遇到了一个非常令人沮丧的问题,我正在通过自动布局约束以编程方式调整我的根视图控制器中容器视图的高度,但是其层次结构中的一个视图没有正确更新其大小,我可以' t弄清楚什么是坏的。当我旋转设备或执行导航时,一切都重新正确布局,因此似乎自动布局代码中可能存在错误。

层次结构有些复杂,但它是这样工作的:

根视图控制器 -> 容器视图 -> 导航控制器 -> 菜单视图控制器

是 MenuViewController 没有正确更新其大小。调整约束后,容器视图和导航控制器都具有正确的高度。我无法弄清楚为什么导航控制器没有将布局更改传递给其子级,直到发生其他一些事件(旋转/导航)迫使它重新计算其布局。

我已经尝试了所有我能想到的强制视图更新其布局的方法(包括 setNeedsUpdateConstraintssetNeedsLayoutlayoutIfNeeded),但我尝试的任何方法似乎都没有任何效果!

【问题讨论】:

【参考方案1】:

终于设法通过手动调整viewDidAppear 中的菜单视图控制器的高度来使其正常工作。然而这显然很难看,所以如果有人能弄清楚如何让自动布局来完成它的工作,请发帖,我会奖励答案。

更新:我通过将委托附加到 UINavigationController 并监视其 navigationController:didShowViewController:animated: 方法并简单地执行以下操作来改进我的实现:

viewController.view.height = navigationController.view.height;

这解决了所有屏幕的问题,而不仅仅是我的菜单控制器。很奇怪,这不仅仅是正常行为,但我猜它会预先计算高度(在应用我的约束之前),因此它可以动画到位。

【讨论】:

以上是关于当父容器视图约束以编程方式更改时,UINavigationController 子视图不调整大小的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更改堆栈视图中容器的高度

在运行时以编程方式激活约束

当我以编程方式更改约束时 Xcode 给出错误

单元格子视图约束在 CellForRowAtIndex 中以编程方式更改

以编程方式修改自动布局约束时视图不更新

以编程方式更改纵横比约束值