Autolayout 是基于 Cassowary 算法實現(xiàn)的一套 UI 布局算法袱贮,能夠有效解析線性等式系統(tǒng)和線性不等式系統(tǒng),用戶的界面中總是會出現(xiàn)不等關(guān)系和相等關(guān)系叫确,Cassowary開發(fā)了一種規(guī)則系統(tǒng)可以通過約束來描述視圖間關(guān)系。約束就是規(guī)則,能夠表示出一個視圖相對于另一個視圖的位置口柳。
Autolayout 布局流程
更新約束,計算布局
當我們寫好了約束代碼之后踩寇,如使用系統(tǒng)自帶的語法啄清,VFL,Masonary,這組成了一個頁面的約束條件辣卒,在一個 View 顯示到屏幕上面之時掷贾,首先會發(fā)現(xiàn)更新約束,你也可以調(diào)用 setNeedsUpdateConstraints 來手動出發(fā)荣茫,通常系統(tǒng)會自動觸發(fā)此方法想帅,隨后系統(tǒng)會在需要的時候調(diào)用 updateConstraintsIfNeeded 方法來表示立即更新 約束,你也有重寫 updateConstraints 來修改約束啡莉。布局視圖
此方法如 layoutSubviews 會將計劃好的布局的 frame 一個個設置到子視圖中港准。你可以通過調(diào)用 setNeedsLayout 來觸發(fā)一個操作請求,這并不會立刻應用布局咧欣,而是在稍后再進行處理浅缸。因為所有的布局請求將會被合并到一個布局操作中去,所以你不需要為經(jīng)常調(diào)用這個方法而擔心魄咕。
Autolayout 其他屬性
Priority 優(yōu)先級
Priority 在一些場景下還是很有用的衩椒,2 個沖突的約束,優(yōu)先級高的會優(yōu)先被滿足哮兰。如毛萌,一個既設置了寬度又設置了距離邊距的 view,可以適當?shù)恼{(diào)整優(yōu)先級在屏幕小的情況下來滿足最佳的視覺范圍喝滞。
intrinsic size (固有尺寸)
我們在將一個 UILabel 或者 UIButton 的添加約束的時候會發(fā)現(xiàn)它們并不需要一個寬高也可以完成工作阁将,這就是 intrinsic size 這個在起作用的,它表示這個 View 可以自己獲取到合適的大小右遭。
Content Compression Priority(抗壓縮的優(yōu)先級)
如果一個父視圖的大小不過做盅,會優(yōu)先壓縮子視圖大小來滿足布局,但是有的時候往往只想壓縮一下無關(guān)緊要的控件大小狸演,這個時候 Content Compression Resistance Priority 就上場了言蛇,如果它的優(yōu)先級越高,那么它越不容易被外界壓縮大小宵距。
Content Hugging Priority(抗拉伸的優(yōu)先級)
和 Content Compression 相反腊尚,Content Hugging 指定的是一個視圖被拉伸的優(yōu)先級,如果值越大满哪,那么越難被拉伸婿斥。