使用autoLayout后吧享,我們?cè)谄匠J褂玫姆椒?/p>
viewDidLoad , viewWillAppear,方法中獲取的Frame會(huì)不正確,這時(shí)候我們可以通過兩種途徑獲取到正確的Frame譬嚣。
1:在想獲取真實(shí) frame 之前調(diào)用一下self.view.layoutIfNeeded()钢颂,這是一個(gè)能用但是并不好的方法:因?yàn)樗M(jìn)行了額外的毫不需要的 frame 計(jì)算。不推薦
2:從試圖控制器的生命周期來看這個(gè)問題:
loadView--->viewDidLoad--->viewWillAppear--->viewWillLayoutSubviews--->viewDidLayoutSubviews
--->viewDidAppear--->viewWillDisappear--->viewDidDisappear
Auto Layout 的布局是從外到內(nèi)的孤荣,即從屏幕尺寸開始布局甸陌,一直布局到最里面的元素。
viewDidLayoutSubviews 時(shí)當(dāng)前視圖已經(jīng)把子元素布局完畢盐股,frame 已經(jīng)形成
viewDidAppear 時(shí)钱豁,渲染系統(tǒng)把當(dāng)前視圖加入父視圖中,顯示在屏幕上
所以疯汁,解決方案已經(jīng)有了:
避免調(diào)用 layoutSubviews牲尺,在 viewDidLayoutSubviews 和 viewDidAppear 中進(jìn)行 frame 的獲取
如果你需要盡早地做一些大動(dòng)作,推薦在 viewDidLayoutSubviews幌蚊,此時(shí)用戶還沒有看到 UI谤碳,用法可以更靈活
注意 viewDidLayoutSubviews 可能會(huì)被多次調(diào)用,所以添加元素之類的操作盡量避免在這里做
viewDidAppear 中可以干一切你想干的事情溢豆,但是一些需要用戶看到的東西例如動(dòng)畫只能在這里做蜒简。