AutoLayout小技巧系列(二)

同事小周丟來一個需求,如圖


要求

  • label1和label2等寬多行
  • ** label3的位置 由label1和label2的內容決定(誰行高就貼著他的底部)**
  • label1和label2不能被拉大,位置居上顯示

那么高潮來了,他給出了他的做法:通過俗套的計算label高度的方式,強行給label3設置約束

我呵呵一笑,既然autoLayout這么方便,那么為啥還要回到frame時代那種又丑又不好用的方式

我的思路

在label3頂部分別給label1 和label2底部拉一根約束,通過判斷label1和label2內容高度決定這兩個約束的優先級,來決定在哪個label的下方,可能說起來比較抽象,那么上圖

  1. 建立這兩個約束,分別是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;

完美!


不給demo的文章都是在耍流氓

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容