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;
上一篇下一篇

猜你喜欢

热点阅读