在使用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种方法。