使用過 Auto Layout 的人肯定都遇到過獲取不到真實 frame 的情況,而大部分人經過簡單搜索都能得到一個滿意的解決方案:在想獲取真實 frame 之前調用一下 self.view.layoutIfNeeded()
,這是一個能用但是並不好的方法:進行了額外的毫不需要的 frame 計算。
我們從 View Controller 的生命周期來分析這個問題:
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
viewWillDisappear
viewDidDisappear
Auto Layout 的布局是從外到內的,即從屏幕尺寸開始布局,一直布局到最裡面的細節元素,我們的目光自然地落在了 viewDidLayoutSubviews
和 viewDidAppear
上了:
所以,解決方案其實已經水落石出了:
回到標題中的問題:什麼時候才能獲得正確的 frame? 在 viewDidLayoutSubviews
和 viewDidAppear
中。