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

約束的優(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
  1. 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被拉伸,要么被壓縮,比如下圖


7.png

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


8.png

9.png

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

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

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