在使用storyboard和Xib进行UI布局的时候,如果同一层级有多个控件,就需要用到
"Content Hugging"
和"Content Compression Resistance"
这两个属性
首先,我们得先来了解下另一个属性 intrinsic size(固有尺寸),一个根据自身内容大小而决定的尺寸。我们都知道,UIButton、UILabel 等,在布局时并不需要给它们设置所有constraints,只需要设置 leading space 和 top space 等能决定 X 跟 Y 的constraints 就能够进行布局,这就是它们的intrinsic size在起作用,决定它们的宽高。
然而当所有控件的 intrinsic size 以及所有 constraints 的总和与上层容器的尺寸不匹配时,就需要"Content Hugging"
和"Content Compression Resistance"
这两个属性来帮忙了。
“Content Hugging”
"Content Hugging"
可以理解为“拉伸抗性”,表现为控件希望自己尽量小,仅够刚好显示出自身的内容即可。当控件们的横向或竖向尺寸总和小于容器尺寸,将会有控件被拉伸,这个属性就是抵抗这一拉伸的能力,优先级高的(数值大)将不被拉伸,优先级低的(数值小)将被拉伸。
如图所示,我在两个 Label 之间以及他们与边缘之间都加了 constrains ,于是势必有一个将被拉伸,结果抗拉优先级低的被拉伸了。
“Content Compression Resistance”
"Content Compression Resistance"
可以理解为“压缩抗性”,表现为控件希望完整的显示出自己的内容。相邻控件由于空间不够的原因势必有控件会被压缩,这个属性就是抵抗这一压缩的能力,于是优先级高(数值大)的控件不会被压缩,优先级低(数值小)的控件将被压缩。
如图所示,我在两个 Label 之间以及他们与边缘之间设置了 constrains ,屏幕的宽度并不足以在一行中显示所有的文字,于是优先级低的 Label 就被压缩了。所幸我将右边的 Label 设置为可多行显示,于是它就被迫换行了。