xib加载时的autoresizingMask问题(二)

1.控制器1modal出控制器2,并且控制器2是通过xib加载出来的.
2.在控制器2viewDidLoad方法中给控制器的view添加一greenView,并且设置greenView.frame = self.view.bounds

控制器2代码

- (void)viewDidLoad {
    [super viewDidLoad]; 

    //创建一个greenView
    UIView *greenView = [[UIView alloc] init];
    greenView.backgroundColor = [UIColor greenColor];

    //初始化greenView的frame为控制器View的bounds
    greenView.frame = self.view.bounds;
    [self.view addSubview:greenView]; 
}
运行结果.gif

观察结果发现绿色View的frame并不和控制器的bounds相同.我们可以在viewDidLoad方法中打印一下

NSLog(@"%@",NSStringFromCGRect(self.view.bounds));

2016-04-17 16:01:57.067 xib内边距问题[7163:286282] {{0, 0}, {600, 600}}

其实这和xib加载有关,观察一下xib,这个xib的宽高也是600,说明在viewDidLoad方法时控制器View的宽高还是xib的宽高,如果在这个时候设置子控件的宽高和view的宽高相同,会造成误差.

这时, autoresizingMask又可以派上用场了.添加如下代码:

greenView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

设置子控件的跟随父控件边距保持不变,这样,就算后来xib加载出来的View变大,子控件也会填充整个屏幕

这个例子中,还有两种方可以实现以上的功能


方法1.用属性引用一下greenView,在方法中设置greenView的frame,这时控制器就算是从xib加载,它的View已经确定,不会发生改变.

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    self.greenView.frame = self.view.bounds;
}

注意:方法1在XCode8中运行也会失效,但在XCode7以及之前会成功


方法2.直接设置greenView的frame等于屏幕的大小

greenView.frame = [UIScreen mainScreen].bounds;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容