Autolayout 是基于 Cassowary 算法實現(xiàn)的一套 UI 布局算法,能夠有效解析線性等式系統(tǒng)和線性不等式系統(tǒng),用戶的界面中總是會出現(xiàn)不等關(guān)系和相等關(guān)系,Cassowary開發(fā)了一種規(guī)則系統(tǒng)可以通過約束來描述視圖間關(guān)系。約束就是規(guī)則,能夠表示出一個視圖相對于另一個視圖的位置。
Autolayout 布局流程
更新約束,計算布局
當(dāng)我們寫好了約束代碼之后,如使用系統(tǒng)自帶的語法,VFL,Masonary,這組成了一個頁面的約束條件,在一個 View 顯示到屏幕上面之時,首先會發(fā)現(xiàn)更新約束,你也可以調(diào)用 setNeedsUpdateConstraints 來手動出發(fā),通常系統(tǒng)會自動觸發(fā)此方法,隨后系統(tǒng)會在需要的時候調(diào)用 updateConstraintsIfNeeded 方法來表示立即更新 約束,你也有重寫 updateConstraints 來修改約束。布局視圖
此方法如 layoutSubviews 會將計劃好的布局的 frame 一個個設(shè)置到子視圖中。你可以通過調(diào)用 setNeedsLayout 來觸發(fā)一個操作請求,這并不會立刻應(yīng)用布局,而是在稍后再進(jìn)行處理。因為所有的布局請求將會被合并到一個布局操作中去,所以你不需要為經(jīng)常調(diào)用這個方法而擔(dān)心。
Autolayout 其他屬性
Priority 優(yōu)先級
Priority 在一些場景下還是很有用的,2 個沖突的約束,優(yōu)先級高的會優(yōu)先被滿足。如,一個既設(shè)置了寬度又設(shè)置了距離邊距的 view,可以適當(dāng)?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)先級,如果值越大,那么越難被拉伸。