Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 它是如何做到的';UILabel实现intrinsicContentSize?_Ios_Objective C - Fatal编程技术网

Ios 它是如何做到的';UILabel实现intrinsicContentSize?

Ios 它是如何做到的';UILabel实现intrinsicContentSize?,ios,objective-c,Ios,Objective C,正如我们所知,UILabel具有intrinsicContentSize,我的难题是当我们将标签固定到其superview(例如,前导和尾随偏移量为10)并将numberOfLines设置为0时,假设superview是宽度为320的viewcontroller视图,label如何知道其宽度为300。 另外,当存在压缩标签的多重约束时,标签如何知道它已压缩并重新计算其大小 intrinsicContentSize独立于任何上下文,包括应用于标签的任何约束。这实际上就是内在的意义 因此,当您询问标

正如我们所知,UILabel具有intrinsicContentSize,我的难题是当我们将标签固定到其superview(例如,前导和尾随偏移量为10)并将numberOfLines设置为0时,假设superview是宽度为320的viewcontroller视图,label如何知道其宽度为300。
另外,当存在压缩标签的多重约束时,标签如何知道它已压缩并重新计算其大小

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

因此,当您询问标签的intrinsicContentSize时,它不知道其宽度将为300,实际上它返回适合其内容的任何宽度。继续,检查它:询问包含“foo”或“Lorem ipsum dolor sit amet,concertetur adipising elit.Vestibulum vitae sapien nec elit luke incident”的标签的内在内容大小。“你不会得到同样的结果。”

你可能会想:如果intrinsicContentSize是(52,21)或(633,21),那么它到底为什么以(300,21)结尾

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


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

根据uiscreen sizeTHX计算尺寸。我觉得UILabel使用属性
preferredMaxLayoutWidth
来计算它的高度。默认值是0,我想知道在上面的例子中这个值是如何设置为300的。现在这是一个不同的问题。preferredMaxLayoutWidth确实由intrinsicContentSize使用:它告诉标签何时应该换行。我不确定它何时被设置为300,但我怀疑是情节提要或包含UILabel的xib文件。preferredMaxLayoutWidth是标签的大小检查器中最上面的项。