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