xib加载时的autoresizingMask问题(二)
2016-04-17 本文已影响217人
codeCoder
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;