问题:
有时候我们会遇到这样的问题:假如在(xib或者sb就统称nib)nib中有一个view(默认大小是100*100),我在控制器中的viewDidLoad方法中更改了frame却发现打印出的值确实是改了,但是实际上显示的结果却没有变化,
罪魁祸首就在在于这里:
![](https://img.haomeiwen.com/i4611461/57810236162f690f.png)
如果我们是从nib中通过拖线连接的属性,那么在viewDidLoad之后会根据初始的frame再计算一次frame,过程中,你虽然更改了frame,但是auto layout之后又恢复了之前的frame,所以模拟器显示没有变化.
但为什么打印值变了呢?很简单,因为auto layout是在viewDidLoad方法之后计算的,所以在viewDidLoad方法中打印出的值肯定改变了,可后面又被改变回原来的值
解决:
由于开发中进场使用xib,或storyBoard来布局,有的时候需要获取某一控件的frame大小,或者在load完xib文件以后修改某控件的frame。这时需要用到的主要方法为 ;
第一种
//不添加这两个方法获得的尺寸会是xib里面未完成autolayout适配的尺寸,storyBoard同理
[view setNeedsLayout];
[view layoutIfNeeded];
第二种
如果需要在加载xib之后修改frame或者获取frame需要在
- (void)viewDidAppear:(BOOL)animated;中修改或者获取
或者在viewDidLayoutSubviews方法中改变frame,这个方法通常是view显示之前最后执行的,所以这里更改没问题
第三种
去掉auto layout,就可以在viewDidLoad方法中更改了
网友评论