UILabel如何实现intrinsicContentSize?

时间:2015-11-27 07:02:34

标签: ios objective-c

正如我们所知,UILabel有内在的内容,我的谜题是当我们将标签固定到它的前导和尾随偏移10的超级视图时,并将numberOfLines设置为0,假设superview是一个viewcontroller&#39 ; s的视图宽度为320,标签如何知道它的宽度为300。 另外,当标签被压缩有多重约束时,标签如何知道它被压缩并重新计算它的大小?

1 个答案:

答案 0 :(得分:3)

intrinsicContentSize独立于任何上下文,包括应用于标签的任何约束。实际上,这就是内在的含义。

因此,当您要求标签的intrinsicContentSize时,它不知道它的宽度将是300,并且实际上它返回适合其内容的任何宽度。继续,检查一下:询问包含“foo”的标签的intrinsicContentSize,或者“Lorem ipsum dolor sit amet,consectetur adipiscing elit.Vestibulum vitae sapien nec elit tongue incident。”你不会得到相同的结果。

知道你可能想知道:如果intrinsicContentSize是(52,21)或(633,21),为什么它在(300,21)结束呢?

答案很简单:intrinsicContentSize生成隐式约束,其优先级由标签的contentHuggingPriority和contentCompressionResistancePriority控制。这些通常小于1000.相反,前导和尾随偏移的优先级是1000,最大值。因此,偏移约束在最终布局中获胜,标签以300宽度结束。

现在尝试将contentHuggingPriority和contentCompressionResistancePriority设置为1000:您将看到冲突。你知道为什么吗?