前言
也许你做ios开发已经有些年了,也许你才刚刚开始加入ios开发大军,大神也好,小白也好,而下面两行代码,也许是我们敲的最想吐的几行代码之一:
self.XXView.frame = CGRectMake(0, 0, 100, 100);
self.XXView.bounds = CGRectMake(0, 0, 100, 100);
一个设置坐标,一个设置边框,这两行我们重复了无数遍的代码,你果真搞清楚了他们之间的区别吗?(已懂的大神请自行return)
我们都知道
frame:决定一个视图在它父视图上的显示区域和大小,以父视图左上角为原点(0,0)
bounds:以自己左上角为原点(0,0),并可以设置自身尺寸大小。
好像我们了解的就仅止于此了
我们现有的开发在使用bounds好像总有一条神秘的命令指挥着我们:CGRect的(x、y)一定要为(0,0),否则便会有不好的事情的发生
//我们一直都在这么做,却不知道为什么
self.XXView.bounds = CGRectMake(0, 0, 100, 100);
事实上,你如果不设为(0,0),确实有不好的事情发生。我们用如下代码验证:
//创建红色view
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
//设置bounds,x,y分别为20,20,宽高不变
redView.bounds = CGRectMake(20, 20, 200, 200);
redView.backgroundColor = [UIColor redColor];
//把红色view添加到控制器view上
[self.view addSubview:redView];
//创建紫色view
UIView *purpleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
purpleView.backgroundColor = [UIColor purpleColor];
//把紫色view添加到红色view上
[redView addSubview:purpleView];
运行页面结果如下:
我们会看到:紫色view的frame(x,y)虽然设为(0,0),但它的左上角却不在父视图左上角,而是偏离出父视图外面去了
为什么,我们只是改变了bounds的x、y而已
好吧,是时候再给bounds做一层注释了:
bounds决定了本地坐标系统的位置和大小
这句话怎么理解呢?
1、我们知道,坐标系最重要的是确定原点(0,0),以哪里为原点才能知道一个view的左上角从哪里开始摆放。
2、view本地坐标系就是它自身的坐标系,这个坐标系是相对于它的子视图而言,即本地坐标系作用于子视图。bounds的x,y决定本地坐标系的坐标原点,系统默认为(0,0)。
3、上面红色view的bounds(x,y)设为了(20,20),也就是它的坐标原点变成了(20,20)。
4、通俗一点的理解,子视图若要处于红色view左上角原点位置,那么它frame的(x,y)要为(20,20)。但是紫色view的(x,y)被设为了(0,0),所以我们要找到坐标系(0,0)位置。即在原点处,向左移动20,向上移动20,就是(0,0)位置。比较绕,请参照下图理解:
上面只是改变了bounds的x和y,若width和height也改呢
我们用代码作如下验证:
//创建红色view
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
//打印此时的frame
NSLog(@"log1:%@",NSStringFromCGRect(redView.frame));
//设置bounds,x,y分别为20,20,宽高为300,300
redView.bounds = CGRectMake(20, 20, 300, 300);
//打印设置完bounds后的frame
NSLog(@"log2:%@",NSStringFromCGRect(redView.frame));
redView.backgroundColor = [UIColor redColor];
//把红色view添加到控制器view上
[self.view addSubview:redView];
打印结果:
2016-08-23 10:52:30.926 frame和bounds区别[1038:38905] log1:{{50, 100}, {200, 200}}
2016-08-23 10:52:30.927 frame和bounds区别[1038:38905] log2:{{0, 50}, {300, 300}}
我们会发现:review的frame不仅width、height变了,x,y也变了,从之前的(50,100),变成了(0,50),x、y都减少了50。
由此我们知道,改变bounds的width和height,不仅会影响frame的width和height(两者的width和height保持一致),还会影响frame的x,y。这种影响是随着bounds的width和height增加或减少,平均扩充或缩减四周的区域。
用上面的例子解释,bounds宽高都增加了100,所以会向四周平均扩充区域,在原来的基础上,往上、往下、往左、往右各扩充50,所以x、y都会减少50。
总结
bounds的有以下两个特点:
1. 它可以修改自己坐标系的原点位置,影响“子view”的显示位置。
2. bounds,它可以通过改变宽高,改变自身的frame,进而影响到再父视图的显示位置和大小。