在使用xib或storyboard布局時,經常會用到addSubview某個控件,然后在代碼viewDidLoad方法中對該控件的Frame的寬和高設置跟父視圖一樣時,一般用CGRectGetWidth(父視圖.frame)和CGRectGetHeight(父視圖.frame)來設置,然而運行后會發現該控件的frame的寬或高并不與父視圖一致。設置斷點發現和Debug View時發現該控件超出父視圖的寬和高了,為什么會這樣呢?
分析原因:xib或storyboard在自適應UI時,viewDidLoad方法獲得的尺寸是xib或storyboard未完成autolayout適配的尺寸。所以,此時對該控件進行設置Frame時會發現不一致的情況。
解決辦法:
- autolayout適配后的尺寸在viewDidAppear方法中去獲取。這樣我們就可以拿到適配后的父視圖的Frame,再來對該控件Frame進行設置。
- 在layoutSubviews方法中
//不添加這下面兩句,獲得的尺寸會是xib和storyboard未完成autolayout適配時的尺寸,增加后獲取的是適配后的尺寸
[self.contentView setNeedsLayout];
[self.contentView layoutIfNeeded];
//這里獲取父視圖適配后的Frame
但是考慮到layoutSubviews方法可能會調用到多次的情況,我建議用第1種方法。