1997年, Auto Layout用到的布局算法Cassowary被發(fā)明了出來(lái)
2011年, 蘋(píng)果公司將Cassowary算法運(yùn)用到了自家的布局引擎Auto Layout中
AutoLayout布局轉(zhuǎn)成視圖的具體尺寸/位置過(guò)程
1.App啟動(dòng)后 開(kāi)啟RunLoop 循環(huán)檢查圖層樹(shù)中是否存在約束變化
2.發(fā)生約束改變(直接/間接設(shè)置 更新 移除約束) RunLoop檢測(cè)到變化
3.布局引擎重新計(jì)算布局 將計(jì)算出新的視圖frame存在于布局引擎中
4.對(duì)比視圖新的frame 如果視圖的位置或尺寸發(fā)生了改變 調(diào)用視圖的父視圖setNeedsLayout打上需要布局的標(biāo)記
5.從上到下(父視圖->子視圖)遍歷視圖層級(jí) 調(diào)用被標(biāo)記為setNeedsLayout視圖的layoutsubViews方法
6.這個(gè)階段是從布局引擎中把計(jì)算好的尺寸/位置設(shè)置到視圖上
重寫(xiě)layoutSubviews可以發(fā)現(xiàn),視圖本身frame在該方法調(diào)用前已經(jīng)有值 子視圖在該方法調(diào)用前是舊值,該方法調(diào)用完畢會(huì)賦上新值
Autolayout與Frame關(guān)系
1.Autolayou本質(zhì)是一個(gè)線性方程解析Engine 通過(guò)描述視圖之間布局關(guān)系 由引擎解析計(jì)算出位置/尺寸值
2.Frame是直接設(shè)置視圖的位置/尺寸數(shù)值
3.一個(gè)視圖使用一種布局方式 要么frame 要么AutoLayout
如果一個(gè)視圖使用了Autolayoutb布局。 程序運(yùn)行中 ,通過(guò)frame設(shè)置位置/尺寸 不生效
AutoLayout布局的不同方式
1.NSLayoutConstraint
2.VFL
3.Interface Builder
4.NSLayoutAnchor
5.Masonry
6.UIStackView