關(guān)鍵詞:
intrinsic content size(固有內(nèi)容大小)未巫、約束優(yōu)先級墩弯、
Content Hugging Priority兰英、
Content Compression Resistance Priority
理論
intrinsic content size: 有些控件能通過自己顯示的內(nèi)容計算出需要的Size,這個自動計算出來size就叫該控件的固有內(nèi)容大小。這個大小是和需要顯示的內(nèi)容相關(guān)的蜗搔。UIButton,UILabel就是具有固有內(nèi)容大小屬性的控件劲藐。UIButton可以根據(jù)它的title字符串長度和需要顯示的image來計算需要的Size,UILabel可以根據(jù)它的text來計算。
約束優(yōu)先級: 在Autolayout中每個約束都有一個優(yōu)先級,在xib或storyboard中雙擊一個約束即可看到它的優(yōu)先級樟凄。優(yōu)先級的范圍是1 ~ 1000聘芜。創(chuàng)建一個約束,默認(rèn)的優(yōu)先級是最高的1000
Content Hugging Priority: 該優(yōu)先級表示一個控件抗被拉伸的優(yōu)先級不同。優(yōu)先級越高厉膀,越不容易被拉伸,默認(rèn)是251二拐。
-
Content Compression Resistance Priority: 該優(yōu)先級和上面那個優(yōu)先級相對應(yīng),表示一個控件抗壓縮的優(yōu)先級凳兵。優(yōu)先級越高百新,越不容易被壓縮,默認(rèn)是750
這些優(yōu)先級的絕對值意義不大庐扫,Autolayout怎么布局只取決于控件優(yōu)先級的相對值饭望,我們可以把固有內(nèi)容的兩個優(yōu)先級也看做是約束,那么自動布局將按照一個簡單的原則處理所有的約束:優(yōu)先級高的形庭,先滿足(好像是廢話铅辞,但可以用這個原則去解釋Autolayout的行為)
現(xiàn)在還是很模糊,沒關(guān)系萨醒,下面我們將通過實(shí)例來看看這條原則是怎么應(yīng)用的斟珊。
實(shí)例
我們在View中添加了一個UILabel,并為其添加了三個約束:在豎直方向居中,距離左邊屏幕145富纸,距離右邊屏幕145囤踩。為了看到UILabel的實(shí)際寬度旨椒,我們將Label的背景色置為灰色。
其運(yùn)行效果如下:
從最后的顯示效果來看堵漱,中間的Label被壓縮了综慎,來滿足左右兩個約束。
根據(jù)第一個圖中標(biāo)注的優(yōu)先級勤庐,左右約束的優(yōu)先級比固有內(nèi)容相關(guān)的優(yōu)先級要高示惊,所以Autolayout布局的時候會優(yōu)先滿足左右兩個約束。這時候:左邊約束寬度(145) + 右邊約束寬度(145) + Label的固有內(nèi)容寬度 > 屏幕寬度愉镰。所以最后只能壓縮Label顯示的寬度涝涤。
Content Compression Resistance Priority
這時候Label是被壓縮的,我們就來演示一下Content Compression Resistance Priority這個優(yōu)先級是如何影響控件的抗壓縮特性的
我們修改右邊的約束優(yōu)先級為700
其運(yùn)行效果如下:
這時候UILabel控件的抗壓縮約束優(yōu)先級比右邊約束優(yōu)先級高岛杀,Autolayout先滿足左邊約束阔拳,然后滿足UILable控件的固有內(nèi)容Size的寬度,最后來調(diào)整右邊約束的寬度类嗤。表現(xiàn)出來就是UILable抗壓縮特性變強(qiáng)了糊肠,它更傾向于顯示它固有內(nèi)容Size。這時候被壓縮的就是右邊的約束遗锣。
Content Hugging Priority
為了演示Label被拉伸的情況货裹,我們將右邊的約束優(yōu)先級恢復(fù)為1000,并將左右約束的寬度都改為50精偿。
其運(yùn)行效果如下:
和壓縮的時候類似弧圆,左右約束優(yōu)先級比UILabel的Content Hugging Priority優(yōu)先級高,并且此時:左邊約束寬度(50) + 右邊約束寬度(50) + Label的固有內(nèi)容寬度 < 屏幕寬度笔咽。為了滿足左右兩個約束搔预,就只有拉伸Label。
此時我們將右邊約束的優(yōu)先級變?yōu)?40叶组。
其運(yùn)行結(jié)果為:
這時候UILabel控件的抗拉伸約束優(yōu)先級比右邊約束優(yōu)先級高拯田,Autolayout先滿足左邊約束,然后滿足UILable控件的固有內(nèi)容Size的寬度甩十,最后來調(diào)整右邊約束的寬度船庇。表現(xiàn)出來就是UILable抗拉伸特性變強(qiáng)了,它更傾向于顯示它固有內(nèi)容Size侣监。這時候被拉伸的就是右邊的約束鸭轮。
實(shí)際應(yīng)用
我們常常遇到的是類似下面的情況:
TitleLabel的顯示內(nèi)容可能會很長,如果不能很好的設(shè)置約束就可能覆蓋后面顯示時間的Label橄霉。但顯示時間的Label也應(yīng)該是一個動態(tài)的長度窃爷。針對這種情況,我們在模擬器中來模擬一下。
兩個Label吞鸭,前面是AddressLabel,后面是TimeLabel,為了不讓兩個Label覆蓋寺董,我們設(shè)定前后Label的水平間距>=10,沒有調(diào)整過任何優(yōu)先級。
顯示效果如下:
這時候系統(tǒng)會默認(rèn)調(diào)整前面Label的寬度刻剥,使其壓縮遮咖,來滿足后面Label能夠完整顯示,這應(yīng)該是系統(tǒng)默認(rèn)行為造虏。這樣看起來剛剛好御吞,但如果我們的需求是時間在前面,并且需要完全顯示漓藕。地址信息在后面陶珠,如果過長就顯示省略號。那么使用上面的默認(rèn)行為就不能滿足要求享钞。
其運(yùn)行結(jié)果為:
這時候前面的TimeLabel會被默認(rèn)壓縮揍诽,不能滿足要求。這時候我們就可以通過改變控件的抗壓縮優(yōu)先級來滿足要求栗竖,我們可以把AddressLabel的抗壓縮優(yōu)先級改為740,比TimeLabel默認(rèn)的750低暑脆,那么Autolayout就會去壓縮AddressLabel,而使TimeLabel按照它固有內(nèi)容的寬度顯示。這就可以滿足我們的要求了狐肢。
來看一下最后的顯示效果:
More
上面簡單闡述了一下相關(guān)約束優(yōu)先級的原理添吗,和他們的簡單應(yīng)用。如果你想去練習(xí)一下份名,我建議你用自動布局去實(shí)現(xiàn)一下新浪微博首頁的Cell碟联,或者微信朋友圈的Cell。