約束的優(yōu)先級(jí)
AutoLayout中添加的約束也有優(yōu)先級(jí),優(yōu)先級(jí)的數(shù)值是1~1000。分為兩種情況:
- 一種情況是我們經(jīng)常添加的各種約束,默認(rèn)的優(yōu)先級(jí)是1000,也就是最高級(jí)別,條件允許的話系統(tǒng)會(huì)滿足我們所有的約束需求。
- 另外一種情況就是固有約束(intinsic content size),嚴(yán)格來說這個(gè)這個(gè)更像是指UILabel和UIButton控件的一種屬性,但是在AutoLayout中這個(gè)屬性的取值和約束優(yōu)先級(jí)的屬性相結(jié)合才能完成圖形的繪制。
我們知道UIButton和UILabel兩種控件可以根據(jù)內(nèi)容長(zhǎng)短來控制控件寬度,當(dāng)展示內(nèi)容的寬度滿足不了約束的要求時(shí)(過短或者過寬),控件就會(huì)被拉伸或者壓縮,當(dāng)我們不想控件被拉伸或者壓縮時(shí),就需要設(shè)置控件的固有約束(intinsic content size)來實(shí)現(xiàn)我們的需求。固有約束分為兩種:
1 ) Content Hugging Priority
官方文檔的解釋是
Returns the priority with which a view resists being made larger than its intrinsic size.
即表示的是控件的抗拉伸優(yōu)先級(jí),優(yōu)先級(jí)越高,越不易被拉伸,默認(rèn)為251
- Content Compression Resistance Priority
Returns the priority with which a view resists being made smaller than its intrinsic size.
這個(gè)優(yōu)先級(jí)的字面意思很明確了,是防壓縮優(yōu)先級(jí),優(yōu)先級(jí)越高,越不易被壓縮,默認(rèn)為750
多說無益,舉個(gè)栗子來感受一下
舉個(gè)栗子
-
我們放置如圖所示約束的一個(gè)label控件,約束的默認(rèn)優(yōu)先級(jí)為1000,固有約束 Content Hugging Priority為251, Content Compression Resistance Priority為750
1.png
運(yùn)行結(jié)果為
2.png
為什么會(huì)這樣呢,不難想到是由于 左邊距+右邊距+Label寬度>屏幕寬度,無法滿足我們所有的約束需求,而根據(jù)優(yōu)先級(jí)的數(shù)值,左右邊距的有限級(jí)(1000)> 抗壓縮優(yōu)先級(jí)(750),所以系統(tǒng)優(yōu)先滿足左右邊距而選擇壓縮Label的方案 -
Content Compression Resistance Priority的影響
我們把左邊距的優(yōu)先級(jí)設(shè)置為700,這時(shí)候它小于Content Compression Resistance Priority為的優(yōu)先級(jí)(750)
3.png
運(yùn)行結(jié)果變?yōu)?/p>
4.png
我們看到Label整體向右偏移了一些來保證Label內(nèi)容能夠顯示完全,這就是由于Content Compression Resistance Priority優(yōu)先級(jí)大于右邊距約束的優(yōu)先級(jí)產(chǎn)生的效果 -
Content Hugging Priority的影響
再來看一下抗拉伸優(yōu)先級(jí)的影響,我們把左右邊距約束的優(yōu)先級(jí)恢復(fù)到1000,左右邊距改為50,看一下效果
5.png
和上個(gè)??對(duì)比一下我們不難想到,由于 左右邊距+固有寬度<屏幕寬度而Content Hugging Priority(251) < 邊距約束的優(yōu)先級(jí)(1000) ,所以系統(tǒng)拉誰了Label本身
如果我們降低右邊距的優(yōu)先級(jí)為240, 小于抗拉伸優(yōu)先級(jí)(251),效果如下
6.png
這時(shí)候系統(tǒng)優(yōu)先滿足了Label的寬度,而沒有滿足右邊距的需求。
這樣,約束的優(yōu)先級(jí)和固有寬度優(yōu)先級(jí)如何相互影響就很明確了,來看一個(gè)工作中的例子。
再舉個(gè)??
場(chǎng)景還原,工作中我們常常會(huì)碰到這種需求,并排放置兩個(gè)Label,左邊的Label寬度根據(jù)內(nèi)容適應(yīng),右邊的Label距離左邊Label有個(gè)固定距離,距離屏幕右邊有個(gè)固定距離,在不設(shè)置優(yōu)先級(jí)的情況下,我們會(huì)經(jīng)常遇到奇怪的現(xiàn)象,要么左邊的Labe被拉伸,要么被壓縮,比如下圖

我們?cè)O(shè)置左邊Label的抗壓縮優(yōu)先級(jí)和抗拉伸優(yōu)先級(jí)都大于右邊Label,效果如圖


由于左邊Label的抗壓縮和抗拉伸優(yōu)先級(jí)都高于右邊Label,而且其他約束的優(yōu)先級(jí)(1000)也都高于右邊label的固有寬度優(yōu)先級(jí),所以系統(tǒng)選擇拉伸或者壓縮了右邊的Label,實(shí)現(xiàn)了我們的需求。





