如何使用自动布局根据子视图调整父视图的高度

Posted

技术标签:

【中文标题】如何使用自动布局根据子视图调整父视图的高度【英文标题】:How to adjust the parent view's height according to its subviews using auto layout 【发布时间】:2014-06-17 03:18:52 【问题描述】:

我已经定制了一个视图,它的子视图的高度会动态改变(我通过改变约束来改变高度)。 我的目的是让视图的高度适应其子视图的高度,所以我什么都不关心,这就是自动布局的用途。

实际上,无法在 IB 中向根视图添加任何约束。 而且我发现我仍然可以更改根视图的框架,这似乎可以解决我当前的问题。但我认为不建议复合自动布局和框架。

那么,还有其他建议吗?

【问题讨论】:

如何利用intrinsicContentSize?我设置了断点,没有人调用 -(CGSize)intrinsicContentSize。 【参考方案1】:

让一些视图使用旧的布局系统(即,autoresizing 和框架设置)而其他视图直接使用自动布局是非常好的。要记住的重要一点是在使用自动布局的代码中实例化的视图上将translatesAutoresizingMaskIntoConstraints 属性设置为NO

但是,您不能在视图控制器的根视图上使用自动布局。

使用自动布局,子视图可以决定其父视图的大小——但如果父视图使用 autoresizing 和框架设置,这将不起作用。

我不知道您正在使用的根视图是场景主视图控制器的根视图还是子视图控制器的根视图。如果是前者,我不建议在 ios 7 中调整根视图的框架。只需让根视图填满整个屏幕(这是它的默认行为)。

【讨论】:

【参考方案2】:

子视图的大小由其父视图决定,而不是相反。对于您的特殊情况,我会让子视图将其高度更改委托回父视图。虽然您可以调整超级视图的矩形(并避免完全更改子视图的高度),但我会这样做:

    创建视图控制器的子视图,该子视图充当新的调整大小的父视图。然后 viewController.view 可以保持全屏显示。然后,您的视图层次结构将是 viewController.view->Resizing Parent->Resizing Child。 为要修改的约束创建一个 IBOutlet。 为子视图创建协议以向其父视图发送调整大小回调。 在收到回调时更新父级的约束常量。

您不必修改子视图的高度,因为约束会为您做到这一点。

【讨论】:

抱歉,标题是“超级浏览量”。这是我的错。我现在把它改成了子视图。

以上是关于如何使用自动布局根据子视图调整父视图的高度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AutoLayout 根据父高度调整子视图高度而不添加/删除约束

如何使用自动调整大小和自动布局并更改其默认行为? [关闭]

使用自动布局调整子视图的大小

我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

如何使用自动布局动态更改超级视图的高度