iOS的一個小技巧——AutoLayout約束的優(yōu)先級

約束的優(yōu)先級

AutoLayout中添加的約束也有優(yōu)先級,優(yōu)先級的數(shù)值是1~1000。分為兩種情況:

  • 一種情況是我們經(jīng)常添加的各種約束,默認的優(yōu)先級是1000,也就是最高級別,條件允許的話系統(tǒng)會滿足我們所有的約束需求。
  • 另外一種情況就是固有約束(intinsic content size),嚴格來說這個這個更像是指UILabel和UIButton控件的一種屬性,但是在AutoLayout中這個屬性的取值和約束優(yōu)先級的屬性相結(jié)合才能完成圖形的繪制。
    我們知道UIButton和UILabel兩種控件可以根據(jù)內(nèi)容長短來控制控件寬度,當展示內(nèi)容的寬度滿足不了約束的要求時(過短或者過寬),控件就會被拉伸或者壓縮,當我們不想控件被拉伸或者壓縮時,就需要設(shè)置控件的固有約束(intinsic content size)來實現(xiàn)我們的需求。固有約束分為兩種:
    1 ) Content Hugging Priority
    官方文檔的解釋是
    Returns the priority with which a view resists being made larger than its intrinsic size.
    即表示的是控件的抗拉伸優(yōu)先級,優(yōu)先級越高,越不易被拉伸,默認為251
  1. Content Compression Resistance Priority
    Returns the priority with which a view resists being made smaller than its intrinsic size.
    這個優(yōu)先級的字面意思很明確了,是防壓縮優(yōu)先級,優(yōu)先級越高,越不易被壓縮,默認為750

多說無益,舉個栗子來感受一下

舉個栗子

  • 我們放置如圖所示約束的一個label控件,約束的默認優(yōu)先級為1000,固有約束 Content Hugging Priority為251, Content Compression Resistance Priority為750


    1.png

    運行結(jié)果為


    2.png

    為什么會這樣呢,不難想到是由于 左邊距+右邊距+Label寬度>屏幕寬度,無法滿足我們所有的約束需求,而根據(jù)優(yōu)先級的數(shù)值,左右邊距的有限級(1000)> 抗壓縮優(yōu)先級(750),所以系統(tǒng)優(yōu)先滿足左右邊距而選擇壓縮Label的方案
  • Content Compression Resistance Priority的影響
    我們把左邊距的優(yōu)先級設(shè)置為700,這時候它小于Content Compression Resistance Priority為的優(yōu)先級(750)


    3.png

    運行結(jié)果變?yōu)?/p>

    4.png

    我們看到Label整體向右偏移了一些來保證Label內(nèi)容能夠顯示完全,這就是由于Content Compression Resistance Priority優(yōu)先級大于右邊距約束的優(yōu)先級產(chǎn)生的效果
  • Content Hugging Priority的影響
    再來看一下抗拉伸優(yōu)先級的影響,我們把左右邊距約束的優(yōu)先級恢復(fù)到1000,左右邊距改為50,看一下效果


    5.png

    和上個??對比一下我們不難想到,由于 左右邊距+固有寬度<屏幕寬度而Content Hugging Priority(251) < 邊距約束的優(yōu)先級(1000) ,所以系統(tǒng)拉誰了Label本身
    如果我們降低右邊距的優(yōu)先級為240, 小于抗拉伸優(yōu)先級(251),效果如下


    6.png

    這時候系統(tǒng)優(yōu)先滿足了Label的寬度,而沒有滿足右邊距的需求。
    這樣,約束的優(yōu)先級和固有寬度優(yōu)先級如何相互影響就很明確了,來看一個工作中的例子。

再舉個??

場景還原,工作中我們常常會碰到這種需求,并排放置兩個Label,左邊的Label寬度根據(jù)內(nèi)容適應(yīng),右邊的Label距離左邊Label有個固定距離,距離屏幕右邊有個固定距離,在不設(shè)置優(yōu)先級的情況下,我們會經(jīng)常遇到奇怪的現(xiàn)象,要么左邊的Labe被拉伸,要么被壓縮,比如下圖


7.png

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


8.png

9.png

由于左邊Label的抗壓縮和抗拉伸優(yōu)先級都高于右邊Label,而且其他約束的優(yōu)先級(1000)也都高于右邊label的固有寬度優(yōu)先級,所以系統(tǒng)選擇拉伸或者壓縮了右邊的Label,實現(xiàn)了我們的需求。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容