autoresizingMask的使用

autoresizingMask的使用

作者QQ:415074476

QQ群:191280586

用来处理当父视图发生变化时,自身的frame怎么跟随变化。常用于适配,和对有无键盘的处理。
主要考虑六个值,上下左右和宽高。
分两个方向。弄清楚了一个方向,另一个方向也就明白了。
这里以Y轴方向举例,有上,高,下 三个值。对应于代码是UIViewAutoresizingFlexibleTopMargin, 上间距可变
UIViewAutoresizingFlexibleHeight 高度可变
UIViewAutoresizingFlexibleBottomMargin 下间距可变 .

下面看图的示例。
初始值:
父视图高200,宽200
子视图为50 50; 100 100.
当我把父视图的高度从200变成400时,子视图会怎么变化呢?
一下一步步看上间距,高度,下间距是怎么影响的。一共有8种可能性。
第一种: 三个值全不设,就是上间距可变,高度不可变,下间距可变。

先来个猜测: 首先高度不可变,那么还是100, 余下就间距为400-100=300.
由于上间距和下间距都可变,我们有理由相信他们是按比例缩放的。
原来是50:50 = 1:1, 那么现在应该还是1:1 = 150:150. 验证下:

猜想成立!!!
第二种:选择上间距为不可变。高度不可变,下间距可变。

再次猜想:上间距不可变,还是50,高度不可变100,余下400-50-100 = 250。
耶,只剩下可变的下间距,必然为250啊。。一个可爱的数字。验证下:

再次验证成立。

第三种:
上间距不选为可变,选择高度可变,下间距可变。

猜想总结:不可变的保留原值。 可变的按比例缩放。
全都可变,比值为50:100:50 = 1:2:1 = 100:200:100 对否?

好吧。又一次验证正确。
可否下结论了呢?
不可变的保留原值。 可变的按比例缩放。

第四种:
上间距不可变。高度可变,下间距可变。

根据上面的猜想:
不可变的50去掉。剩下350。
高度:下间距= 100:50 = 116.6: 233.3
哇,出小数了。。

呵呵。。被四舍五入了。

还继续么?我想用不着了。
再来个吧:
上间距可变, 高度可变,下间距不可变。

根据猜想应该是:
可变的上间距:可变的高度 = 50:100 = 116.6: 233.3

好吧。 纠正一个小错误。不是四舍五入。而是舍弃小数。
这么一来下间距还是不可变的50么?

和猜想冲突了?
好吧, 这里有个事实:
nib文件里的frame只能用整数,而实际上cocoa是支持小数的。
用代码测试下第五种情况。
UIView *parentView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
parentView.backgroundColor = [UIColor blackColor];
UIView *childView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
childView.backgroundColor = [UIColor redColor];
childView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin| UIViewAutoresizingFlexibleHeight;
[self.view addSubview:parentView];
[parentView addSubview:childView];
[parentView release];
[childView release];
[parentView setFrame:CGRectMake(50, 50, 200, 400)];
NSLog(@”%@”, NSStringFromCGRect(childView.frame));
很遗憾还是这个值。
{{50, 116}, {100, 233}}
一定是舍掉小数么?

UIView *parentView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
parentView.backgroundColor = [UIColor blackColor];
UIView *childView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100.5)];
childView.backgroundColor = [UIColor redColor];
childView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin| UIViewAutoresizingFlexibleHeight;
[self.view addSubview:parentView];
[parentView addSubview:childView];
[parentView release];
[childView release];
[parentView setFrame:CGRectMake(50, 50, 200, 400)];
NSLog(@”%@”, NSStringFromCGRect(childView.frame));
结果是:
{{50, 116}, {100, 234}}
猜想结果是:
{{50, 116.27}, {100, 233.7.3}}
这次又四舍五入了。

汗,没源码可整不明白了。
只能顶一个结论:不可变的保留原值。 可变的按比例缩放。
至于算出来有小数会不会四舍五入。
目前看来高度会四舍五入,上间距都是舍弃。
有兴趣的同学可以对这个小数问题再研究啊~~