虽然问题以编程方式说明,遇到了同样的问题,并且更喜欢在 Interface Builder 中工作,但我认为使用 Interface Builder 解决方案添加到现有答案可能会很有用。
首先要忘记sizeToFit。自动布局将根据内在内容大小代表您处理此问题。
因此,问题是,如何使用自动布局获取标签以适应其内容?具体来说 - 因为问题提到了它 - 高度。请注意,同样的原则也适用于宽度。
让我们从一个高度设置为 41px 高的 UILabel 示例开始:
正如您在上面的屏幕截图中所见,"This is my text" 在上方和下方都有填充。这是 UILabel 的高度和它的内容文本之间的填充。
如果我们在模拟器中运行应用程序,果然,我们看到的都是一样的:
现在,让我们在 Interface Builder 中选择 UILabel,并查看 Size 检查器中的默认设置:
请注意上面突出显示的约束。这就是Content Hugging Priority。正如 Erica Sadun 在出色的 iOS Auto Layout Demystified 中所描述的那样:
视图倾向于避免围绕其核心内容进行额外填充的方式
对于我们来说,有了 UILabel,核心内容就是文字。
这里我们来到了这个基本场景的核心。我们给了我们的文本标签两个约束。他们冲突。有人说“高度必须等于 41 像素高”。另一个说“拥抱它的内容,这样我们就没有任何额外的填充”。在我们的例子中,将视图拥抱它的 text,这样我们就没有任何额外的填充。
现在,使用自动布局,两个不同的指令说做不同的事情,运行时必须选择一个或另一个。它不能两者兼得。 UILabel 不能同时为 41 像素高, 和 没有填充。
解决方法是指定优先级。一条指令必须具有比另一条更高的优先级。如果两条指令说的不同,并且具有相同的优先级,则会发生异常。
所以让我们试一试吧。我的身高限制的优先级为 1000,这是必需。内容拥抱高度250,弱。如果我们将高度限制优先级降低到 249,会发生什么?
现在我们可以看到神奇的开始发生了。让我们在 sim 中尝试:
太棒了!实现内容拥抱。只是因为高度优先级 249 小于内容拥抱优先级 250。基本上,我是说“我在这里指定的高度不如我为内容拥抱指定的高度重要”。所以,拥抱的内容获胜。
底线,让标签适合文本可以像指定高度或宽度约束一样简单,并正确设置与该轴的内容拥抱优先级约束相关联的优先级。
将等价的宽度作为练习留给读者!