动态高度标签和文本字段

Posted

技术标签:

【中文标题】动态高度标签和文本字段【英文标题】:Dynamic height label and Text field 【发布时间】:2017-07-17 01:42:44 【问题描述】:

在下图中,它们有以下限制:

我对约束 4-7 的工作方式感到困惑。这个配方声称它在运行时根据最高的控件(高度)动态设置控件的垂直间距(名称标签和名称文本视图)。因此,如果标签的固有高度为 48(由于字体增加),则 textview 的高度也会与名称标签的高度匹配。我在代码中的任何地方都看不到这种关系:nameTextView.height = nameLabel.height + 0?

同样在约束 4 中它说它可以 >= 但在约束 5 中它说它必须等于(具有较低优先级)。系统如何决定在什么时间使用哪个约束?

来源:https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/ViewswithIntrinsicContentSize.html#//apple_ref/doc/uid/TP40010853-CH13-SW16

【问题讨论】:

【参考方案1】:

约束 5 和 7 用于定义接口的默认值,因为约束 4 和 6 是不等式并接受多种可能性。

在这个例子中,他们从来没有说nameTextViewnameLabel 一定是相同的高度。这四个约束实际上是在照顾它们的不同高度。

下面是它们的工作原理:

约束4和6分别定义了top到nameLabelnameTextView的距离,CAN BE(注意这个术语)等于或大于20。所以如果只设置这两个,Xcode会丢失如果它们实际上大于或等于,这就是为什么您需要具有低优先级约束(5 和 7)的原因,它们为 Xcode 提供指导,即在低优先级下它们都将从 20“开始”,然后程序尝试满足4 和 6,通过检查谁更高(因为 4 和 6 承认 20 或更高):nameLabelnameTextView。如果nameLabel 更高,则通过将其垂直距离设置为20 来满足约束4,通过将nameTextView 到顶部的垂直距离设置为大于20(根据它们的高度差自动计算)来满足约束6。现在,一切都满意了,自动布局就成功了!

希望这会有所帮助。

【讨论】:

那么系统会首先尝试满足约束 5 和 7,即使它们的优先级低于 4 和 6? 其实我认为首先它会看到 4 和 6,因为它们具有更高的优先级,但是由于它们是不等式的,所以它们会看到低优先级的约束,然后再了解该怎么做,如前所述跨度> "如果nameLabel更高,则通过将其垂直距离设置为20来满足约束4,通过将nameTextView与顶部的垂直距离设置为大于20来满足约束6(由他们的高度)”如果名称标签更高,为什么垂直距离为 20 但约束 6 将大于 20?也许我不明白这种不平等实际上意味着什么。约束在某种程度上就像一个布尔值,只是检查它是否大于或等于 20,而不是实际为约束设置值? 我不确定我是否明白你在说什么。在所有情况下,两者都是>=20=20>=20,是>=20的特例之一。重要的部分是您不能删除低优先级约束,因为程序需要一个起始值。否则它无法决定哪个是间距(因为>=20 包含无限的值集)。因此,在这种情况下,最高的视图将始终默认为 =20,最短的视图将默认为大于 20 的 20+theHeightDifference 如果您查看约束编号 8,它表示两个文本的基线应该相等。如果标签和文本视图的大小不同,则两个视图中的顶部空间不能相同(即 20)。所以发生的情况是,它们从 20 开始,它试图满足基线约束,失败并将最短的顶部空间更改为大于 20。如果它这样做到最高,你将无法匹配基线,因为您需要一个小于 20 的常数来满足这种情况。所以你去吧,它将最高设置为=20,最短设置为>20

以上是关于动态高度标签和文本字段的主要内容,如果未能解决你的问题,请参考以下文章

根据标签文本长度动态自定义 UITableViewCell 的高度

动态表视图高度

具有比例宽度和文本驱动高度的动态 UILabel

无法根据标签的文本动态调整标签的高度

根据单元格OBjective-C中的标签文本(动态)增加单元格高度

Swift中基于标签文本长度的动态自定义UITableViewCell的高度