在使用storyboard進(jìn)行UI布局時(shí),我們經(jīng)常不經(jīng)意間會(huì)注意到“Content Compression Resistance Priority”和“Content Hugging Priority”這兩個(gè)屬性。

下面給大家簡單介紹下這兩個(gè)小家伙:
首先,我們得先來了解下另一個(gè)屬性intrinsic size(固有尺寸),一個(gè)根據(jù)自身內(nèi)容大小而決定的尺寸。我們都知道,UIButton、UILabel等,在布局時(shí)并不需要給它們?cè)O(shè)置所有constraints,只需要設(shè)置 leading space 和 top space 等能決定 X跟Y的constraints 就能夠進(jìn)行布局,這就是它們的intrinsic size在起作用,決定它們的寬高。
那么,“Content Compression Resistance Priority”和“Content Hugging Priority”這兩個(gè)小家伙跟intrinsic size有什么淵源?
在開發(fā)中,我們難免會(huì)同時(shí)對(duì)兩個(gè)UILabel或者UIButton進(jìn)行布局,比如水平并行布局,或者垂直并行布局:
我只是簡單的為它們添加了決定x和y的constraints,并沒有給他們其他設(shè)置,按照我們剛才講的intrinsic size(固有尺寸)兩個(gè)label應(yīng)該在除了x和y不同外,寬高保持一致。但是,正如你我所見,在storyboard上,兩個(gè)label寬高并不一樣。水平并行的label寬度不同,垂直并行的label高度不同。可見,intrinsic size(固有尺寸)在同時(shí)對(duì)多個(gè)label進(jìn)行布局時(shí)并不顯得那么夠!
產(chǎn)生這樣的效果的原因是:
1. 在水平并行布局中,兩個(gè)label的intrinsic size(固有尺寸)加起來比它們的父view(圖中藍(lán)色的view)還要寬,因此父view沒辦法完全展示它們,只能通過壓縮它們來實(shí)現(xiàn);
2. 而在垂直并行布局中,兩個(gè)label的intrinsic size(固有尺寸)加起來并沒有它們的父view那么高,父view為了展示他們,只能將它們拉伸。
通過上圖,我們清楚的看到,系統(tǒng)并不是同時(shí)對(duì)兩個(gè)label進(jìn)行壓縮或者拉伸,而是只針對(duì)其中一個(gè)。這就是intrinsic size(固有尺寸)跟“Content Compression Resistance Priority”和“Content Hugging Priority”這兩個(gè)小家伙的關(guān)系了。
“Content Compression Resistance Priority”,也叫內(nèi)容壓縮阻力優(yōu)先級(jí)(小名:別擠我),該優(yōu)先級(jí)越高,則越晚輪到被壓縮。
“Content Hugging Priority”,也叫內(nèi)容緊靠優(yōu)先級(jí)(小名:別扯我),該優(yōu)先級(jí)越高,這越晚輪到被拉伸。
因此,在父view大小不夠布局子label時(shí),我們可以通過增加某個(gè)label的Content Compression Resistance Priority(內(nèi)容壓縮阻力優(yōu)先級(jí))來防止被壓縮。當(dāng)然降低自身則可以讓自己被壓縮。
同理,在父view大小太大時(shí),我們可以通過增加label的Content Hugging Priority(內(nèi)容緊靠優(yōu)先級(jí))來防止被拉伸。降低則可以達(dá)到被拉伸的目的。
歡迎大家拍磚交流