很多時(shí)候我比較喜歡用代碼添加視圖,特別是要同時(shí)添加很多UIView時(shí),而且跟xib比起來更容易管理,在多人的項(xiàng)目中代碼不容易conflict.
UIViewController 中動態(tài)添加UIView正確的步驟應(yīng)該是:
1.在viewDidload 中創(chuàng)建要添加的UIView..為什么不能在viewWillAppear中創(chuàng)建?根據(jù)蘋果的文檔,這里是添加last minute 修改的地方,比如修改視圖的位置,顏色等等,如果在這里創(chuàng)建很多視圖,會導(dǎo)致顯示延遲.
2.創(chuàng)建的時(shí)候最好為每個(gè)UIView 加上約束,(NSLayoutConstraint) ,這樣在不同大小的屏幕中都可以正確顯示.
3.不用約束也行,必須在viewDidLayoutSubviews中修改視圖的frame
下面我們來復(fù)習(xí)一下UIViewController的生命周期;
A.init...
B.loadView
C.viewDidLoad
D.viewWillAppear
E.viewWillLayoutSubviews
F.viewDidLayoutSubviews
G.viewDidAppear
H.viewWillDisappear
I.viewDidDisappear
J.viewDidUnload (not used any more)
K.dealloc...
現(xiàn)在咱可以做個(gè)實(shí)驗(yàn): 在項(xiàng)目中選一個(gè)View Contorller ,它的 xib 中的視圖大小為 600×600, 在其 .m 文件中以上的 C, D耗溜,E组力,F(xiàn),G方法打印出視圖的frame抖拴,像這樣:
-(void)viewDidLoad{
[superviewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"%s self.view.frame: %@",__PRETTY_FUNCTION__,NSStringFromCGRect(self.view.frame));
}
-(void)viewWillAppear:(BOOL)animated
{
[superviewWillAppear:animated];
NSLog(@"%s self.view.frame: %@",__PRETTY_FUNCTION__,NSStringFromCGRect(self.view.frame));
}
-(void)viewWillLayoutSubviews
{
NSLog(@"%s self.view.frame: %@",__PRETTY_FUNCTION__,NSStringFromCGRect(self.view.frame));
}
-(void)viewDidLayoutSubviews
{
NSLog(@"%s self.view.frame: %@",__PRETTY_FUNCTION__,NSStringFromCGRect(self.view.frame));
}
-(void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
NSLog(@"%s self.view.frame: %@",__PRETTY_FUNCTION__,NSStringFromCGRect(self.view.frame));
}
選擇設(shè)備為 iPhone 5燎字, 運(yùn)行程序后會得到類似這樣的結(jié)果:
[TaskDetailsViewControllerviewDidLoad]self.view.frame:{{0,0},{600,600}}
[TaskDetailsViewControllerviewWillAppear:]self.view.frame:{{0,0},{600,600}}
[TaskDetailsViewControllerviewWillLayoutSubviews]self.view.frame:{{0,0},{320,568}}
[TaskDetailsViewControllerviewDidLayoutSubviews]self.view.frame:{{0,0},{320,568}}
[TaskDetailsViewControllerviewDidAppear:]self.view.frame:{{0,0},{320,568}}
大家可以看到,一個(gè)視圖的大小是在調(diào)用 viewWillLayoutSubviews 時(shí)才會根據(jù)設(shè)備而改變阿宅,不過在 IOS 8 中候衍,要到viewDidLayoutSubviews 才正確。根視圖的大小改變了洒放,子視圖必須相應(yīng)做出調(diào)整才可以正確顯示蛉鹿,這就是為什么要在 viewDidLayoutSubviews 中調(diào)整動態(tài)視圖的frame。
By the way往湿,在 IOS 9 中妖异,根視圖控件(Root View Controller)的視圖大小在 viewDidLoad 中就已經(jīng)正確了惋戏,蘋果好像會不時(shí)改變這些特點(diǎn),比如會把系統(tǒng)鍵盤的視圖優(yōu)先級提高等等他膳。所以小牛哥覺得動態(tài)添加視圖最安全的方法是响逢,創(chuàng)建視圖后馬上加上約束,不管日后蘋果怎么改都可以正確顯示矩乐。