同事小周丟來一個需求,如圖
要求
- label1和label2等寬多行
- ** label3的位置 由label1和label2的內容決定(誰行高就貼著他的底部)**
- label1和label2不能被拉大,位置居上顯示
那么高潮來了,他給出了他的做法:通過俗套的計算label高度的方式,強行給label3設置約束
我呵呵一笑,既然autoLayout這么方便,那么為啥還要回到frame時代那種又丑又不好用的方式
我的思路
在label3頂部分別給label1 和label2底部拉一根約束,通過判斷label1和label2內容高度決定這兩個約束的優先級,來決定在哪個label的下方,可能說起來比較抽象,那么上圖
-
建立這兩個約束,分別是label3和label1垂直方向,label3和label2垂直方向的約束(姑且設為0)
2.把這兩個約束優先級都設為750(低于1000就行),為啥要低于1000,可以看我之前的AutoLayout小技巧系列(一)
3.判斷這label1和label2的內容大小,我這里采取簡單粗暴的直接比較字符串長度,然后決定上面兩個約束的優先級
BOOL label1LonerThanLabel2 = label1.text.length> label2.text.length;
lcToLabel1.priority = label1LonerThanLabel2?UILayoutPriorityDefaultHigh:UILayoutPriorityDefaultLow;
lcToLabel2.priority = label1LonerThanLabel2?UILayoutPriorityDefaultLow:UILayoutPriorityDefaultHigh;
按理來說,到這里就結束了,但是如圖,沒有滿足上述需求的第三點,另一個label被拉大了,居中顯示變得很難看!?。?!
仔細研究了一下,發現label本身的Hugging (這個屬性可以理解為frame由內容決定,阻止被外部因素拉大)的Priority就是UILayoutPriorityDefaultLow,那么跟上述低優先級一致,然后系統判斷就被拉大了
方案
只要將label本身的Hugging Priority 設置的高一些或者 代碼直接改成如下就ok了
BOOL label1LonerThanLabel2 = label1.text.length> label2.text.length;
lcToLabel1.priority = label1LonerThanLabel2?UILayoutPriorityDefaultHigh:UILayoutPriorityFittingSizeLevel;
lcToLabel2.priority = label1LonerThanLabel2?UILayoutPriorityFittingSizeLevel:UILayoutPriorityDefaultHigh;
完美!