AutoLayout是在ios6中引入的,極大的簡(jiǎn)化了頁(yè)面布局洲尊,成為xib開(kāi)發(fā)必備神器远豺。然而,想要用好AutoLayout并不是一件簡(jiǎn)單的事坞嘀,其中有二個(gè)很實(shí)用的約束在各類書(shū)籍和資料里都很少提及躯护,那就是hugging 和 compression resistance約束。下面就來(lái)說(shuō)說(shuō)什么是 hugging 和 compression resistance約束丽涩。
我們可以在這個(gè)位置找到Hugging 和 Compression Resistance約束
Hugging約束
Hugging priority 確定view有多大的優(yōu)先級(jí)阻止自己變大榛做。這么講還是比較抽象,那么用UILabel舉例,通俗的講就是 “有兩個(gè)隱形的力將UILabel盡力向里擠壓检眯,直到剛好顯示出文字為止”
該約束的默認(rèn)優(yōu)先級(jí)為251厘擂。如果還是不明白的話,可以看看下面的例子锰瘸。
我對(duì)UILabel設(shè)置了上下左右4個(gè)約束(hugging約束是UILabel自帶的刽严,用箭頭表示),由于左右兩邊的設(shè)置的約束距離較短避凝,左右兩邊的約束優(yōu)先級(jí)值為1000舞萄,大于hugging約束的251,因此管削,label的寬度并不是正好與文字寬度相等倒脓,而是被拉開(kāi)了一點(diǎn),如紅色方框所示含思。
下面我將做一點(diǎn)變化崎弃,我將右側(cè)的約束的優(yōu)先值改成250,小于hugging約束含潘,如圖所示:
由于右側(cè)的約束優(yōu)先級(jí)為250饲做,小于hugging的約束251,因此遏弱,UILabel成功被擠壓盆均,直到正好顯示內(nèi)容的字體。
Compression Resistance約束
如果理解了hugging約束漱逸,那么理解起來(lái)Compression Resistance約束就不困難了泪姨,通俗得講,Compression Resistance約束就是[“有兩個(gè)隱形的力將UILabel盡力向外拉饰抒,直到剛好顯示出文字為止”]該約束的默認(rèn)優(yōu)先級(jí)默認(rèn)為750肮砾。正好與hugging約束相反。
我們將約束調(diào)整循集,由于現(xiàn)在設(shè)置的約束不足以讓Label顯示出完整內(nèi)容唇敞,因此,UIlabel的內(nèi)容變成了“...”顯示咒彤。下面同樣將右側(cè)的約束優(yōu)先值修改為749疆柔,小于Compression Resistance約束默認(rèn)的750。
可以看到镶柱,UILabel成功被“撐開(kāi)”了旷档,直到完整得顯示出所有內(nèi)容。
Hugging約束和Compression Resistance約束的實(shí)際運(yùn)用
文章一開(kāi)始我就講了這個(gè)2個(gè)約束很有用歇拆,但是直到現(xiàn)在還沒(méi)有說(shuō)明其到底有什么用鞋屈。下面我就來(lái)說(shuō)說(shuō)這2個(gè)約束的實(shí)際運(yùn)用范咨。
在我做項(xiàng)目的時(shí)候,產(chǎn)品經(jīng)理有一個(gè)需求厂庇,有2個(gè)Label,左邊是商品標(biāo)題渠啊,右邊是單價(jià),這兩個(gè)Label排成一行权旷,優(yōu)先顯示單價(jià)替蛉,左邊顯示不下就換行顯示,而不能用"..."顯示拄氯。大致布局大概就像這樣躲查。
一般的解決方法就是通過(guò)計(jì)算,算出左右兩邊的Label的寬度译柏,再布局镣煮,這樣就要寫(xiě)很多代碼,其實(shí)只要通過(guò)修改Hugging約束就能解決鄙麦。
我們要做的典唇,只要把左邊Label的Hugging約束的優(yōu)先值設(shè)為250,小于右邊Label的hugging約束的優(yōu)先值黔衡,再把左邊Label的Line設(shè)成0就解決上述要求啦蚓聘。