根据内容自动设置自定义 UIView 的高度?

Posted

技术标签:

【中文标题】根据内容自动设置自定义 UIView 的高度?【英文标题】:Automatically set height of custom UIView based on its contents? 【发布时间】:2015-06-26 09:09:53 【问题描述】:

在问这个问题之前,我花了很多时间阅读其他问题,但还没有设法解决这个问题——希望有人能提供帮助。

我有一个自定义警报视图,一个 UIView 子类。我试图让它进入一个宽度固定的状态,它的高度根据它的两个标签(titlemessage)的高度动态增长,并且可以设置动态数量的操作按钮跟上。

我使用 AutoLayout 来设置控件,效果很好,但现在我仍然在其初始化程序中手动设置视图本身的框架。

我需要做的是让视图的高度由我的两个标签和 n 个按钮的高度加上它们之间的间距来计算。

我尝试为我的视图提供intrinsicContentSize,但该方法从未被调用,甚至不要求它,所以我不知道如何继续。

总结一下:我可能需要 ios9 的 UIStackView,但我没有那么奢侈,所以我需要在 iOS 7 / 8 中加入类似的东西。我看过 OAStackView,但我不想使用外部依赖。

【问题讨论】:

您可以尝试为视图创建一个高度限制的出口,然后根据标签的高度管理heightContraint.constant 何时更新约束?我不确定这些标签的高度是什么时候计算出来的。 尝试在viewDidLayoutSubViews中设置 【参考方案1】:

快速思考一下:您是否尝试过在 Interface Builder 中创建视图?给它一个固定宽度,优先级:1000。不添加高度约束,但在其父视图中垂直居中。

然后将View的垂直内容拥抱优先级和垂直内容抗压优先级设置为1000。

这应该会导致视图根据其子视图计算自己的高度。您只需要确保子视图以一种定义高度的方式绑定到父视图,而不会产生任何歧义。

【讨论】:

我最初没有这样做的唯一原因是按钮的数量可以是动态的。我还能用 IB 处理吗? 也许您可以使用 UITableView 并将每个按钮放在一个单元格中来执行此操作。这会很痛苦,因为您必须实现所有 Tableview/Tableviewcell 等。如果您有最大数量的按钮,您可以通过在 IB 中添加此数量的按钮并在不需要时将其高度约束设置为 0 来解决此问题.不是很好的风格,但应该可以。

以上是关于根据内容自动设置自定义 UIView 的高度?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 标题部分的高度不会为自定义 UIView() 类自动调整

根据内容自动增加视图的高度

如何使用自动布局在 UIScrollView 中为视图高度设置动画?

使用自动布局自定义集合视图单元格的动态高度

实现一个在autolayout下有宽度约束后,自动确定高度的view

使用 CGAffineTransformScale 自定义 UIView 缩放