Content Hugging Priority 和 Content Compression Resistance Priority

要理解这两个东西首先要知道 intrinsicContentSize ,这个UIView的属性返回的是控件本身的大小,简单的说就是一个控件,它的大小是由它内容确定的。比如UILabel,它的文本内容越多,它的intrinsicContentSize大小越大,又比如UIImageView,它的原始image尺寸决定了它的intrinsicContentSize。但是当2个或多个依靠intrinsicContentSize来确定大小的控件出现时,时常会引起约束的歧义。

最常见的例子,如下图:

Label2增加了一个距离父控件尾部距离的一个约束后,出现了一个Content Priority的歧义,

介绍下两个参数的大致意思:

Content Hugging Priority 意思是控件阻止其自身被拉伸的优先级,该优先级越高,越不容易被拉伸。

Content Compression Resistance Priority 意思是控件阻止其自身被压缩(也就是缩小)的优先级,该优先级越高,越不容易被压缩。

因为两个控件在水平方向的Content Hugging Priority一样都是251,系统不知道该拉伸哪一个控件来达到约束的条件,所以报了错误。

要解决这个错误,首先要明确需求,比如我希望Label1始终保持它自身的大小,不要被压缩,也不要被拉伸,Label2,可以拉伸,也可以压缩。

我们只需要将Label2水平方向的Content Compression Resistance PriorityContent Hugging Priority都调的比Label1低就可以了。

让我们试着把两个Label的文本增加一些

可以看到,Label1始终保持着自己的大小,而Label2被压缩了。

最后附上一张帮助理解的图,非常形象,来自@mokagio: