布局約束優(yōu)先級(jí)-初探

日常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)容裆熙,歡迎留言提出修改意見_

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末端礼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子入录,更是在濱河造成了極大的恐慌蛤奥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僚稿,死亡現(xiàn)場離奇詭異凡桥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚀同,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門缅刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢络,你說我怎么就攤上這事衰猛。” “怎么了刹孔?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵啡省,是天一觀的道長。 經(jīng)常有香客問我髓霞,道長卦睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任方库,我火速辦了婚禮结序,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纵潦。我一直安慰自己徐鹤,他們只是感情好配喳,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凳干,像睡著了一般晴裹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上救赐,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天涧团,我揣著相機(jī)與錄音,去河邊找鬼经磅。 笑死泌绣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的预厌。 我是一名探鬼主播阿迈,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼轧叽!你這毒婦竟也來了苗沧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤炭晒,失蹤者是張志新(化名)和其女友劉穎待逞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體网严,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡识樱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了震束。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怜庸。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垢村,靈堂內(nèi)的尸體忽然破棺而出割疾,到底是詐尸還是另有隱情,我是刑警寧澤肝断,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布杈曲,位于F島的核電站,受9級(jí)特大地震影響胸懈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恰响,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一趣钱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胚宦,春花似錦首有、人聲如沸燕垃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卜壕。三九已至,卻和暖如春烙常,著一層夾襖步出監(jiān)牢的瞬間轴捎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工蚕脏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侦副,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓驼鞭,卻偏偏與公主長得像秦驯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挣棕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容