日常iOS開發(fā)過程中碳抄,可能不太需要關(guān)注“約束優(yōu)先級(jí)”這一概念;大部分頁面布局的約束(NSLayoutConstraint)
使用Storybaord提供的默認(rèn)優(yōu)先級(jí)(priority)
就能解決。但是某些情況下竿报,了解NSLayoutConstraint的priority屬性俄删,卻能解決方便解決棘手的問題。
下面引用蘋果官方的一段話開始本文的討論:
約束不僅限于等量關(guān)系点待,它還可以是(>=)或者(<=)來描述兩個(gè)屬性之間的關(guān)系阔蛉,由 NSLayoutRelation 定義。約束還有 1 ~ 1000的優(yōu)先級(jí)癞埠,優(yōu)先級(jí)為1000的約束為必須滿足状原,優(yōu)先級(jí)為 1 ~ 999 的約束為可選約束,數(shù)字越大其優(yōu)先級(jí)越高苗踪,其滿足的可能性越高颠区,自動(dòng)布局系統(tǒng)在滿足了所有優(yōu)先級(jí)為 1000 的約束后,會(huì)按照優(yōu)先級(jí)從高到低的順序滿足可選約束通铲。默認(rèn)情況下毕莱,所有約束優(yōu)先級(jí)都是 1000,即必須滿足颅夺。
內(nèi)部內(nèi)容尺寸(Intrinsic Content Size)
我選了兩個(gè)典型的優(yōu)先級(jí)類型來配合講解今天的內(nèi)容:內(nèi)容壓縮阻力優(yōu)先級(jí)(Content Compression Resistance Priority)和內(nèi)容吸附性優(yōu)先級(jí)(Content Hugging Priority)朋截;每個(gè)視圖都有這兩個(gè)優(yōu)先級(jí)。在理解壓縮阻力優(yōu)先級(jí)和內(nèi)容吸附性優(yōu)先級(jí)之前碗啄,還需要理解什么是內(nèi)部內(nèi)容尺寸(Intrinsic Content Size)质和。
也許你沒聽說過這些概念,但其實(shí)它就在Size Inspector最下面的位置稚字,如圖饲宿,只是平時(shí)不需要關(guān)注它而已:
要說明內(nèi)部內(nèi)容尺寸厦酬,還需要引用蘋果官方的相關(guān)描述翻譯內(nèi)容如下:
簡單來說就是,像按鈕瘫想、文本標(biāo)簽這類視圖控件仗阅,在布局的時(shí)候,它們自己內(nèi)部比外部布局代碼更清楚自己需要多大的尺寸來顯示自己的內(nèi)容国夜。而這個(gè)尺寸就是由內(nèi)部內(nèi)容尺寸(intrinsic content size)來傳達(dá)的减噪。這就相當(dāng)于,內(nèi)部內(nèi)容尺寸告訴布局系統(tǒng):“這個(gè)視圖里面包含了一些你不能理解的內(nèi)容车吹,但是我給你指出了那些內(nèi)容有多大筹裕。”
Content Compression Resistance 與 Content Hugging
- 內(nèi)容壓縮阻力優(yōu)先級(jí)(Content Compression Resistance)
內(nèi)容壓縮阻力優(yōu)先級(jí), 是指 view 阻止其視圖大小被壓縮到小于其內(nèi)部內(nèi)容尺寸的優(yōu)先級(jí), 即視圖反壓縮的優(yōu)先級(jí)窄驹,優(yōu)先級(jí)越大朝卒,視圖就越不容易被壓小。當(dāng)自動(dòng)布局系統(tǒng)為所有視圖布局時(shí)乐埠,遇到約束要求該 view 的尺寸需要小于其內(nèi)部內(nèi)容尺寸會(huì)用到抗斤。
一句話總結(jié):決定著是否能壓縮到小于自身內(nèi)容尺寸;優(yōu)先級(jí)大時(shí)丈咐,最小尺寸是內(nèi)容尺寸
- 內(nèi)容吸附性優(yōu)先級(jí)(Content Hugging)
內(nèi)容吸附性優(yōu)先級(jí), 是指 view 阻止其視圖大小被拉伸到大于其內(nèi)部內(nèi)容尺寸的優(yōu)先級(jí)瑞眼,即視圖反拉伸的優(yōu)先級(jí),優(yōu)先級(jí)越大棵逊,視圖就越不容易被拉大伤疙。
一句話總結(jié):決定是否能夠拉伸到大于自身內(nèi)容尺寸;優(yōu)先級(jí)比較大時(shí)歹河,最大尺寸是內(nèi)容尺寸
實(shí)際應(yīng)用場景討論
如圖掩浙,現(xiàn)有兩個(gè)Lable:label1和lable2花吟;有這樣一個(gè)需求:需要lable1內(nèi)容比較少時(shí)秸歧,視圖尺寸隨內(nèi)容變化,內(nèi)容比較多時(shí)衅澈,能夠截?cái)嘁徊糠诛@示键菱,多余部分省略號(hào)表示;lable2不能截?cái)囡@示今布,內(nèi)容要都顯示出來经备。
按照一般步驟,首先得加五個(gè)約束(優(yōu)先級(jí)為默認(rèn)UILayoutPriorityRequired部默,必須滿足)侵蒙;此時(shí)會(huì)發(fā)現(xiàn),storyboard有約束警告傅蹂,因?yàn)樽詣?dòng)布局系統(tǒng)在滿足了所有約束之后纷闺,分不清是該壓縮lable1算凿,還是壓縮lable2;這時(shí)應(yīng)該想到修改優(yōu)先級(jí)了犁功。
那么該怎么修改呢氓轰?
問題中提到,lable1內(nèi)容比較多時(shí)浸卦,內(nèi)容截?cái)嗍鸺Γ襩able2不允許截?cái)啵詌able1的內(nèi)容壓縮阻力優(yōu)先級(jí)應(yīng)該比lable2低限嫌;
lable1內(nèi)容比較少時(shí)靴庆,尺寸隨內(nèi)容變化;說明lable1的抗拉伸優(yōu)先級(jí)比lable2強(qiáng)怒医,可以想到lable1的內(nèi)容吸附性優(yōu)先級(jí)高撒穷。
問題最終解決方案如圖:
- lable1設(shè)置:
- lable2設(shè)置
最終效果如下:
- lable1內(nèi)容較少時(shí):
- lable1內(nèi)容較多時(shí),截?cái)囡@示:
總結(jié)內(nèi)容裆熙,歡迎留言提出修改意見_