1.關(guān)于 awakeFromNib
awakeFromNib 是繼承自 NSObject
這個方法是用來提供把 nib 文件加載到 application 中的,但是 nib 文件中添加的約束是什么時候生效的呢?
在 vc 的 viewDidLoad 調(diào)用之前,會先調(diào)用添加到 vc.view的子 View 的 awakeFromNib 方法(如果是從 nib 加載),
2.layoutSubViews
從文檔里可以看到,在 iOS5.1之前,這個方法does nothing,
否則,我們可以重寫layoutSubViews中的約束來確定任何 subViews,不要直接調(diào)用,可以下一次視圖更新之前調(diào)用 setNeedsLayout,如果想立即更新,調(diào)用 layoutIfNeeded.
view 的 layoutSubViews 被調(diào)用的情況:
1.addSubView
2.frame 發(fā)生改變
3.滑動 UIScrollView
4.旋轉(zhuǎn) Screen
5.改變 view的 subview 的 frame
6.調(diào)用 setLayoutSubViews
3.setNeedsLayout
標記為需要重新布局,異步調(diào)用 layoutIfNeeded,
在下一次 重新布局update cycle 之前調(diào)用 ,在主線程調(diào)用,因為 UIKit 下面的都不是線程安全的
4.layoutIfNeeded
立即刷新 UI
5.viewDidLayoutSubviews
當 vc.view的 bounds發(fā)生變化的時候,比如旋轉(zhuǎn)。view會調(diào)整 subviews 的 position,然后系統(tǒng)會調(diào)用這個方法。
3.storyBoard 中約束作用時間問題
先在 storyBoard 的 vc.view 中添加一個 viewA,
我試著在 VC 的 awakeFromNib 里面打印在viewA,為nil,如果對 viewA 發(fā)送消息也是無效的,因為 viewA 為 nil。但是 vc.view 的信息能打印出來,vc.view 的約束是正確的.
那么在 storyBoard 中的 vc.view 上添加的子 View 是什么時候創(chuàng)建的呢?
在 viewDidLoad 方法中打印 viewA,關(guān)鍵的來了,如果 storyBoard 中 viewA 存在 misplaced,viewA 打印出來的是viewA:<UIView: 0x7fd8595055e0; frame = (67 253; 240 128); autoresize = RM+BM; layer = <CALayer: 0x60800003ecc0>>,但是如果 updateFrames 之后,打印的是viewA:<UIView: 0x7feab1608610; frame = (0 0; 1000 1000); autoresize = RM+BM; layer = <CALayer: 0x608000035140>>
所以一旦把 viewA updateFrames,約束的作用時間就延后了,在 ViewDidLoad 之后??
我又試著在 storyBoard 的 vc.view中添加了一個 子 view: viewB
在 viewDidLoad 中手動添加約束,發(fā)現(xiàn)是能獲取到 viewA 的約束的,說明在 storyBoard更新約束后, viewA 的約束作用時間確實延后了
[UINib instantiateWithOwner:options:]方法會調(diào)用[ViewController awakeFromNib],
VC 的 awakeFromNib 會調(diào)用 nib 文件里面 vc 的view 的子 View,然后 VC awakeFromNib
然后[UIViewController loadViewIfRequired]會調(diào)用[ViewController viewDidLoad]方法,