今天來說一說UILabel的約束設置問題
首先主要介紹:Priority(控件約束的優先級)、Content Hugging Priority(控件抗拉伸優先級)、Content Compression Resistance Priority(控件抗壓縮優先級),好的,開始一個個介紹。
1.Priority控件中每一個約束都有優先級,在xib和storyboard中很容易看到,如圖:
在這里可以設置約束的優先級,優先級的取值范圍是1~1000,控件的約束會有限滿足優先級高的,控件的約束默認都是1000。
2.Content Hugging Priority(控件抗拉伸優先級) 優先級越高越不容易被拉伸,默認是250。
3.Content Compression Resistance Priority(控件抗壓縮優先級) 和拉伸一樣,優先級越高的越不容易和壓縮,默認是750。
上面只是簡單介紹一下,下面進入演練中。
在view中添加一個label,設置約束左:150,右150,垂直居中,最好給label設置背景顏色,這樣比較容易看清label的長度。
運行之后,顯示為
為什么會顯示成這個樣子,我們的label的居然被壓縮了,這並不是我們想要的結果,原因請接着往下看。
Content Compression Resistance Priority(抗壓縮的優先級)是750,而我們控件約束默認的是1000,此時肯定會先滿足控件約束的,所以label被壓縮了。要體現抗壓縮性也就是說label不被壓縮這時要將label的左或者右約束優先級設置小於750。此時就會先滿足抗壓縮,控件的約束就先放一邊了。我是將label的右約束優先級改成650了,顯示結果為:
好了,肯定會有小伙伴罵我,我靠,這什么鬼,不要驚訝,這是正常的,因為我設置的約束有點大了,並且文字沒換行,小伙伴們可以自己調試一下,多動手才能印象深刻。
接下來演示被拉伸的效果。
此時我們設置label的左右距屏幕邊約束為60,優先級設置默認的1000,顯示結果為:
是的,你會發現label被拉伸了,這是因為label的抗拉伸優先級是250,而label約束的優先級是1000,這是系統肯定會優先考慮label的約束,所以label被拉伸了。當我們設置label右約束為240時,當然也可以設置左側,注意:可以同時設置左右約束的優先級,但是如果你設置的都小於250時,不能讓label的左右的優先級相等,這是為什么呢?因為既然約束的優先級小於抗拉伸的優先級label肯定不會被拉伸,這時label的左右約束優先級還一樣,你讓系統執行那一個約束?如果都執行那就是label被拉伸,如果都不執行label還會顯示嗎?所以這樣設置會當場報錯,看來系統也是很明智的。好了,正確設置完之后結果會顯示這樣:
這樣label沒有被拉伸,顯示了它的固有尺寸。
把自己的理解寫出了,有不對的地方請小伙伴們指正。