手動布局為什么比自動布局效率要高?
實際上這個問題主要是針對iOS12之前,使用AutoLayout,視圖嵌套的數(shù)量對性能的影響是呈指數(shù)增長的。因為在iOS12之后,AutoLayout的性能跟手動布局已經(jīng)相差很小了。
AutoLayout原理
AutoLayout用到了布局算法Cassowar算法和一整套布局引擎Layout Engine
每個視圖在得到它的布局之前,Layout Engine會將視圖、約束、優(yōu)先級、固定大小通過計算轉換成最終的位置和大小。
具體工作流程:
- 當約束變化,添加、刪除視圖、設置constant和priority會觸發(fā)約束變化
- Layout Engine碰到約束變化時會重新計算布局
- 獲取到新約束后,調用
superview.setNeedLayout() - 然后會進入Deferred Layout Pass,主要是做一些容錯處理。比如說有約束缺失或者沒有確定,會在這里做容錯處理
- 接下來,Layout Engine 會從上到下調用 layoutSubviews() ,通過 Cassowary 算法計算各個子視圖的位置,算出來后將子視圖的 frame 從 Layout Engine 里拷貝出來
- 最后,當runloop到來的時候,去重新繪制操作(這一步跟手動布局一樣)
因此使用 Auto Layout 和手寫布局 的區(qū)別,就是多了布局上的這個計算過程
性能問題
在iOS12之后,它是這樣的:

iOS優(yōu)化后
而在此之前的 Auto Layout,視圖嵌套的數(shù)量對性能的影響是呈指數(shù)級增長的。
這是因為iOS 12 之前,很多約束變化時都會重新創(chuàng)建一個計算引擎 NSISEnginer 將約束關 系重新加進來,然后重新計算。結果就是,涉及到的約束關系變多時,新的計算引擎需要重新計 算,最終導致計算量呈指數(shù)級增加。