为什么需要preferredMaxLayoutWidth?

时间:2016-07-20 16:02:43

标签: ios autolayout uikit

为什么需要preferredMaxLayoutWidth?

UIKit reference

  

preferredMaxLayoutWidth

     

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

     

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

请注意:

  

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

因此,在多行标签上,如果未设置preferredMaxLayoutWidth属性,文字是否会继续超出bounds的{​​{1}}? 为什么我们希望在我们明确设置为多线的标签上发生这种情况?

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

1 个答案:

答案 0 :(得分:18)

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

有时候,你明确地约束一个或两个:你可以说"我希望我的标签宽300点,"或者"我希望我的标签恰好高一行。"然后,系统可以根据您的约束和标签中的文本找出其他维度。

但是,其他时候,你也没有约束 - 你可能希望标签在可用空间内包装,但如果它没有很多文字,则水平收缩,所以你不要&# 39; t精确约束宽度或高度。在这种情况下,自动布局可能会混淆,因为文本确实没有"内在大小"很多其他内容的方式。例如:

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选项结合使用时,可以将最大布局宽度设置为例如第一个运行时布局宽度。

希望有助于澄清事情!