手動(dòng)布局為什么比自動(dòng)布局效率要高屈溉?
實(shí)際上這個(gè)問題主要是針對iOS12之前宵统,使用AutoLayout窿给,視圖嵌套的數(shù)量對性能的影響是呈指數(shù)增長的。因?yàn)樵趇OS12之后抚芦,AutoLayout的性能跟手動(dòng)布局已經(jīng)相差很小了倍谜。
AutoLayout原理
AutoLayout用到了布局算法Cassowar算法和一整套布局引擎Layout Engine
每個(gè)視圖在得到它的布局之前,Layout Engine會(huì)將視圖叉抡、約束尔崔、優(yōu)先級、固定大小通過計(jì)算轉(zhuǎn)換成最終的位置和大小褥民。
具體工作流程:
- 當(dāng)約束變化您旁,添加、刪除視圖轴捎、設(shè)置constant和priority會(huì)觸發(fā)約束變化
- Layout Engine碰到約束變化時(shí)會(huì)重新計(jì)算布局
- 獲取到新約束后,調(diào)用
superview.setNeedLayout()
- 然后會(huì)進(jìn)入Deferred Layout Pass蚕脏,主要是做一些容錯(cuò)處理侦副。比如說有約束缺失或者沒有確定,會(huì)在這里做容錯(cuò)處理
- 接下來驼鞭,Layout Engine 會(huì)從上到下調(diào)用 layoutSubviews() 秦驯,通過 Cassowary 算法計(jì)算各個(gè)子視圖的位置,算出來后將子視圖的 frame 從 Layout Engine 里拷貝出來
- 最后挣棕,當(dāng)runloop到來的時(shí)候译隘,去重新繪制操作(這一步跟手動(dòng)布局一樣)
因此使用 Auto Layout 和手寫布局 的區(qū)別亲桥,就是多了布局上的這個(gè)計(jì)算過程
性能問題
在iOS12之后,它是這樣的:
而在此之前的 Auto Layout固耘,視圖嵌套的數(shù)量對性能的影響是呈指數(shù)級增長的题篷。
這是因?yàn)閕OS 12 之前,很多約束變化時(shí)都會(huì)重新創(chuàng)建一個(gè)計(jì)算引擎 NSISEnginer 將約束關(guān) 系重新加進(jìn)來厅目,然后重新計(jì)算番枚。結(jié)果就是,涉及到的約束關(guān)系變多時(shí)损敷,新的計(jì)算引擎需要重新計(jì) 算葫笼,最終導(dǎo)致計(jì)算量呈指數(shù)級增加。