AutoLayout魔法 - Hugging 和 Compression
來自: http://www.liuchendi.com/2016/01/29/iOS/35_hugging-and-compression-resistance/
用AutoLayout也有一段時間了, 之前一直都不是很理解 Content Hugging 和 Content Compression 的優先級。今天就把這個問題給解決了,到底這兩個東西要怎么用?這篇文章算是學習筆記吧
Intrinsic Content Size
在學習這兩個東西前,首先得明白 Intrinsic Content Size 的概念,字面上的意思就是固定大小,也就是控件自身內置的大小。像 UIView 、 UILabel 、 UIButton 等控件,這些控件的內置大小是根據控件本身內容決定的。 我們應該都做過Cell動態高度的計算,Label的高可以根據內容的大小來計算。
優先級
首先在Storyboard里面拉一個UILabel,可以看到默認的 Hugging 優先級是251, Compression 優先級是750。并且提供了水平和垂直兩個方向的設置
優先級的取值范圍在1-1000。提供了默認的優先級選項
- Low: 優先級是1
- High: 優先級是750
- Required: 優先級是1000
Content Hugging 和 Content Compression 區別
借用網上的一張圖片來說明兩者的不同,圖片出自 這里

Content Hugging : 代表的是拉伸難易程度,優先級越高,越難拉伸 Content Compression: 代表的是壓縮難易程度,優先級越高,越難壓縮
練習例子
1、水平放置三個Label,彼此間有間距。第一個Label會根據屏幕寬度的不同自動拉伸,另外兩個不受影響。
首先不受影響的話,后面兩個Label的優先級應該是一樣的,并且要大于第一個的優先級,這樣才能保證不容易拉伸。
布局是這個樣子的
豎屏結果是:
橫屏結果是:
2、水平放置兩個Label,第一個Label的Compression優先級比第二個低。
布局是這個樣子的

豎屏結果是:
橫屏結果是:
因為壓縮優先級低于第二個,所以第一個在豎屏的時候被壓縮了
3、那接上一個的練習,如果第一個Label的優先級大于第二個,結果又會是怎么樣呢?
豎屏的結果是
橫屏的結果是
可以看到因為第一個Label的優先級比較高,所以難以壓縮,把第二個Label直接擠沒了。在橫屏的時候才可以顯示完全
參考資料
1、 http://krakendev.io/blog/autolayout-magic-like-harry-potter-but-real
2、 https://www.mgenware.com/blog/?p=491
3、 http://c0ming.me/content-hugging-and-compression-resistance/
</div>