先來看一個(gè)常見的應(yīng)用場景:

隨著title1和title2文字的增多,title1向右增長,title2向左增長,要求
1 不管它們怎么增長,他們都不能碰頭,要求他們之間有一個(gè)最小距離
2 如果兩邊都在增長,因?yàn)槭怯娑鴣?,那么勢必有一方?huì)被擠壓(顯示點(diǎn)點(diǎn)),那未被擠壓的那一方就贏了繼續(xù)朝著原來方向增長,
所以要求:如果兩邊都在增長,優(yōu)先讓title1增長,即優(yōu)先讓title1顯示完全,此時(shí)如果title2顯示不下就顯示點(diǎn)點(diǎn)點(diǎn)
3 在條件2的情況下,如果title1很長,那么它會(huì)繼續(xù)向右增長,此時(shí)它也一直會(huì)擠壓title2,為了不讓title2不被完全擠壓掉(一個(gè)字或者點(diǎn)點(diǎn)都沒了)
要求:title2不能被完全擠壓掉,要求它最少也要顯示一點(diǎn),即要求它有一個(gè)最小寬度(這也同時(shí)保證了title1有一個(gè)最大寬度)
要解決上面的問題,恐怕還只能用今天要講的Content Hugging Priority 和 Content Compression Resistance Priority這兩個(gè)東西了,為什么呢?講它門之前我們得先來了解另外一個(gè)東西
Intrinsic Content Size,固有大小,什么意思呢,簡單來講就是它知道自己的大小,如果你沒有為它指定大小,那它就按照這個(gè)大小來,那么不給它指定大小,它怎么知道自己有多大呢,那就是根據(jù)自身的內(nèi)容,比如UILabel,UIButton,UIImageView這些視圖,都有 Intrinsic Content Size 屬性,都不需要給它們指定大小,它能根據(jù)內(nèi)容計(jì)算出自身大小來,
這些根據(jù)Intrinsic Content Size來確定自身大小的視圖,會(huì)隨著自身內(nèi)容變大而變大,變小而變小,那么問題來了,如果是單個(gè)這樣的視圖變化沒關(guān)系,不需要對(duì)它做什么限制,但如果是兩個(gè)或者多個(gè)視圖,這樣變化,并且變化到一定程度需要對(duì)他們進(jìn)行限制,比如上面例子,兩邊都在增長,但是增長到一定程度,他們不能碰頭,必須得有個(gè)距離,而且此時(shí)繼續(xù)增長只能滿足一邊,而另一邊只能壓縮,那么此時(shí)誰增長,誰壓縮呢,那就要看誰的防壓縮能力強(qiáng)一些,誰防壓縮能力強(qiáng),誰就不會(huì)被壓縮,就繼續(xù)增長,相反,誰防壓縮能力弱一些,那它輸了,它就會(huì)被壓縮了, 那么說到底就是比雙方的防壓能力了,而這個(gè)防壓能力就是上面的Content Compression Resistance Priority了,防止壓縮優(yōu)先級(jí),簡單說就是防止壓縮能力,誰優(yōu)先級(jí)高,誰防壓能力就強(qiáng),所以上面的title1這個(gè)優(yōu)先級(jí)肯定高于title2,
那么是不是就完了呢,還有一個(gè)Content Hugging Priority沒講呢,這里沒有用到它是不是它就不需要了呢,不,這里它也必須得要,,Content Compression Resistance Priority是在兩邊內(nèi)容很多都在增長,一方為了防止被另一方擠壓而派上用場,而如果兩邊內(nèi)容都很少呢,因?yàn)樗鼈冎g有一個(gè)距離約束,而且這個(gè)約束是一定得有的,那么內(nèi)容很少的時(shí)候,有一方肯定要被拉伸,有一方不被拉伸,那么誰被拉伸,誰不被拉,這就要看誰的防拉伸能力強(qiáng)一些,誰防拉伸能力弱一些,誰防拉能力強(qiáng),它就不被拉伸,誰防拉能力弱,它就會(huì)被拉伸了,而這個(gè)防拉伸能力就是Content Hugging Priority了,放拉伸優(yōu)先級(jí),簡單說就是防止拉伸能力,而上面的title1和title2在內(nèi)容都很少的情況下,你讓誰拉伸都沒關(guān)系,這個(gè)看具體場景,比如實(shí)際中還有一個(gè)視圖是基于title1的那么此時(shí)就不能讓title1拉伸了,但是必須要有一方要拉伸,就是有一方Content Hugging Priority要高一些,不然就會(huì)報(bào)錯(cuò),想想也是那么回事,該壓縮的時(shí)候得壓縮,該拉伸的時(shí)候得拉伸,那么相應(yīng)的約束肯定也不能少
一句話總結(jié):
兩個(gè)或兩個(gè)以上的由Intrinsic Content Size決定其大小的視圖,由于某些必須的約束相互作用,導(dǎo)致在有些情況下,必須有視圖要被壓縮,有些情況下,有視圖要被拉伸,那么誰要被壓縮,誰要被拉伸,就看誰的防壓縮能力和防拉伸能力強(qiáng)弱了,就需要對(duì)他們設(shè)置Content Hugging Priority和Content Compression Resistance Priority了。
那么上面的約束就是:
title1上面,左邊一個(gè)約束,
title2上邊,右邊一個(gè)約束,
title1和title2之間有一個(gè)距離約束
title2有一個(gè)大于等于50的約束
Content Compression Resistance Priority==》title1>title2
Content Hugging Priority必須得有,title1>title2或者title1
title1約束如下:

title2約束如下:

上面例子講的是一個(gè)往左邊增,一個(gè)往右增,那么還有兩種情況,兩個(gè)都往右,或者兩個(gè)都往左,下面只講一種,兩個(gè)都往右增長(另外一種都向左增長和這個(gè)一樣道理)如下:

要求
1 增長的過程中,它們有一個(gè)距離,并且如果他們一直增長,title2快到最右邊的時(shí)候,不能超過最右邊(墻壁)它與最右邊必須要有一個(gè)距離。
2 如果兩邊一直增長,當(dāng)title2到達(dá)最右邊的時(shí)候,因?yàn)樗c最右邊有一個(gè)距離,那么勢必有一方會(huì)被擠壓(顯示點(diǎn)點(diǎn)),那未被擠壓的那一方就繼續(xù)增長,
所以要求:如果兩邊都在增長,優(yōu)先讓title1增長,即優(yōu)先讓title1顯示完全,此時(shí)如果title2顯示不下就顯示點(diǎn)點(diǎn)點(diǎn)
3 在條件2的情況下,如果title1很長,那么它會(huì)繼續(xù)向右增長,此時(shí)它也一直會(huì)擠壓title2,為了不讓title2不被完全擠壓掉(一個(gè)字或者點(diǎn)點(diǎn)都沒了)
要求:title2不能被完全擠壓掉,要求它最少也要顯示一點(diǎn),即要求它有一個(gè)最小寬度(這也同時(shí)保證了title1有一個(gè)最大寬度)
設(shè)置約束關(guān)鍵點(diǎn):
title1防壓縮能力強(qiáng)些,
title1和title2防拉伸能力設(shè)置誰強(qiáng)都可以,
title2距離最右方一定得有個(gè)約束
title2要有一個(gè)最小寬度
具體設(shè)置約束如下:
title1如下:

title2如下:

demo地址https://github.com/aszkj/KJAutoLayoutSillDemo