为啥需要 preferredMaxLayoutWidth?

Posted

技术标签:

【中文标题】为啥需要 preferredMaxLayoutWidth?【英文标题】:Why exactly is preferredMaxLayoutWidth needed?为什么需要 preferredMaxLayoutWidth? 【发布时间】:2016-07-20 16:02:42 【问题描述】:

为什么需要preferredMaxLayoutWidth?

UIKit reference 说

preferredMaxLayoutWidth

多行标签的首选最大宽度(以磅为单位)。

这个属性影响布局约束时标签的大小 应用于它。在布局期间,如果文本超出宽度 由该属性指定,附加文本流向一个或 更多的新行,从而增加标签的高度。

注意这一点:

如果文本超出此属性指定的宽度,则附加文本将流动到一个或多个新行

那么,在多行标签上,如果没有设置preferredMaxLayoutWidth 属性,那么文本是否会超出boundsUILabel为什么我们会希望在我们明确设置为多行的标签上发生这种情况?

这个属性存在的真正原因是什么?它与自动布局有关吗?请解释一下,我真的很想明白这一点。

【问题讨论】:

一个非常好的用例是将 UILabel 的宽度限制为 tableView 的边界。例如你会做cell.myCellLabel.preferredMaxLayoutWidth = tableView.bounds.width。有关更多信息,请参阅here。一个 【参考方案1】:

您的猜测是正确的——它与自动布局有关。当系统需要布局多行标签时,需要知道标签的宽度和高度两个维度。

有时,您明确限制一个或两个:您可以说“我希望我的标签宽度为 300 磅”或“我希望我的标签正好高一行”。然后系统可以根据您的约束和标签中的文本找出另一个维度。

不过,在其他时候,您也没有限制 - 您可能希望标签在可用空间内换行,但如果其中没有很多文本,则水平收缩,因此您无需限制确切的宽度或高度。在这种情况下,自动布局可能会感到困惑,因为文本并不像许多其他内容那样真正具有“固有大小”。例如:

A sentence can be quite long horizontally,

or
it
might
be
skinny
but
tall

这两种布局——以及介于两者之间的许多布局——在 Auto Layout 眼中同样有效。为了帮助指导它,Apple 引入了 preferredMaxLayoutWidth 属性来包装标签。如果您的标签没有明确设置确切的宽度或高度,UIKit 将开始在第一行布局文本,直到您达到该布局的首选最大宽度,然后换行并在后续每一行继续该过程。

如果未设置preferredMaxLayoutWidth,则文本不会超出标签的bounds。相反,会发生以下两种情况之一:

标签会越来越宽,扩展其frame.size.width 以将文本放在一行中,直到全部呈现,或者 标签会截断其文本

实际上,这使得preferredMaxLayoutWidth 属性成为一种机制,用于在包装文本时指导自动布局的行为不需要您编写一堆动态约束代码来实现相同的效果。这是一个非常方便的快捷方式,尤其是与一些 Interface Builder 选项结合使用以将最大布局宽度设置为例如First Runtime Layout WidthAutomatic

希望这有助于解决问题!

【讨论】:

什么是第一个运行时布局宽度? preferredMaxLayoutWidth 比添加精确的宽度约束约束更少。如果其中的文本少于一行,它增加了让环绕标签水平收缩的灵活性,并且如果您的文本没有完全填满该宽度的一行,它也可以将单词环绕在宽度不足的地方。这不是约束;它只是简化约束系统的自动布局助手。 嘿蒂姆。经过大量调查后,我得出结论,如果我们想根据视图大小自动“preferredMaxLayoutWidth”(即设置宽度约束与超级视图相同)。我们不能从 IB 单独完成,我们必须结合代码。我对吗? + 你能解释一下在实践中如何使用'First Runtime Layout Width'吗? 嘿@Tim,非常感谢您的回复!我不再需要详细信息了:) 请原谅我的无知,但我确实在 IB Inspector 选项卡上搜索了 30 分钟,在 xCode 8 上的 UILabel 对象上,但找不到此属性。我错过了什么吗? 我认为在 Xcode 8 中,他们将名称缩短为“Preferred Width”,并且除非您设置明确的值,否则将自动使用 First Layout Runtime Width。选中 UILabel 后,它位于右侧边栏中的第五个选项卡(大小检查器)中——它显示为一个带有占位符文本“自动”的文本框,旁边有一个标记为“显式”的复选框。让它自动应该让您获得 First Layout Runtime Width 行为。

以上是关于为啥需要 preferredMaxLayoutWidth?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥需要 preferredMaxLayoutWidth?

为啥需要 JsonRequestBehavior?

为啥我的程序需要两行输入,为啥我的 GPA 计算错误 c#?

为啥我们需要回调事件?

为啥我们需要`cacheRedirects`?