關(guān)于 Autolayout

Autolayout 是基于 Cassowary 算法實現(xiàn)的一套 UI 布局算法,能夠有效解析線性等式系統(tǒng)和線性不等式系統(tǒng),用戶的界面中總是會出現(xiàn)不等關(guān)系和相等關(guān)系,Cassowary開發(fā)了一種規(guī)則系統(tǒng)可以通過約束來描述視圖間關(guān)系。約束就是規(guī)則,能夠表示出一個視圖相對于另一個視圖的位置。

Autolayout 布局流程

  1. 更新約束,計算布局
    當(dāng)我們寫好了約束代碼之后,如使用系統(tǒng)自帶的語法,VFL,Masonary,這組成了一個頁面的約束條件,在一個 View 顯示到屏幕上面之時,首先會發(fā)現(xiàn)更新約束,你也可以調(diào)用 setNeedsUpdateConstraints 來手動出發(fā),通常系統(tǒng)會自動觸發(fā)此方法,隨后系統(tǒng)會在需要的時候調(diào)用 updateConstraintsIfNeeded 方法來表示立即更新 約束,你也有重寫 updateConstraints 來修改約束。

  2. 布局視圖
    此方法如 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)先級,如果值越大,那么越難被拉伸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容