同事小周丟來一個(gè)需求,如圖
要求
- label1和label2等寬多行
- ** label3的位置 由label1和label2的內(nèi)容決定(誰行高就貼著他的底部)**
- label1和label2不能被拉大,位置居上顯示
那么高潮來了叠纷,他給出了他的做法:通過俗套的計(jì)算label高度的方式衣吠,強(qiáng)行給label3設(shè)置約束
我呵呵一笑之剧,既然autoLayout這么方便,那么為啥還要回到frame時(shí)代那種又丑又不好用的方式
我的思路
在label3頂部分別給label1 和label2底部拉一根約束力奋,通過判斷l(xiāng)abel1和label2內(nèi)容高度決定這兩個(gè)約束的優(yōu)先級(jí)驼修,來決定在哪個(gè)label的下方,可能說起來比較抽象,那么上圖
-
建立這兩個(gè)約束,分別是label3和label1垂直方向酥艳,label3和label2垂直方向的約束(姑且設(shè)為0)
2.把這兩個(gè)約束優(yōu)先級(jí)都設(shè)為750(低于1000就行),為啥要低于1000爬骤,可以看我之前的AutoLayout小技巧系列(一)
3.判斷這label1和label2的內(nèi)容大小充石,我這里采取簡(jiǎn)單粗暴的直接比較字符串長(zhǎng)度,然后決定上面兩個(gè)約束的優(yōu)先級(jí)
BOOL label1LonerThanLabel2 = label1.text.length> label2.text.length;
lcToLabel1.priority = label1LonerThanLabel2?UILayoutPriorityDefaultHigh:UILayoutPriorityDefaultLow;
lcToLabel2.priority = label1LonerThanLabel2?UILayoutPriorityDefaultLow:UILayoutPriorityDefaultHigh;
按理來說霞玄,到這里就結(jié)束了赫冬,但是如圖浓镜,沒有滿足上述需求的第三點(diǎn),另一個(gè)label被拉大了劲厌,居中顯示變得很難看!L2贡恰!
仔細(xì)研究了一下雅任,發(fā)現(xiàn)label本身的Hugging (這個(gè)屬性可以理解為frame由內(nèi)容決定风范,阻止被外部因素拉大)的Priority就是UILayoutPriorityDefaultLow,那么跟上述低優(yōu)先級(jí)一致沪么,然后系統(tǒng)判斷就被拉大了
方案
只要將label本身的Hugging Priority 設(shè)置的高一些或者 代碼直接改成如下就ok了
BOOL label1LonerThanLabel2 = label1.text.length> label2.text.length;
lcToLabel1.priority = label1LonerThanLabel2?UILayoutPriorityDefaultHigh:UILayoutPriorityFittingSizeLevel;
lcToLabel2.priority = label1LonerThanLabel2?UILayoutPriorityFittingSizeLevel:UILayoutPriorityDefaultHigh;
完美硼婿!