「OC」frame和bounds的区别
前言
在我们平时在使用OC编程的时候,最近常使用frame和bounds来布局控件的位置和大小,但是学了这么久还不太懂这两者的区别,于是我就进行了以下学习在UIView之中frame和bounds之间的具体区别。
frame
当我们布局每一个控件的时候,多数都需要使用来frame来布局其相关的位置,frame是根据当前视图的父视图的左上角为锚点进行参照,如下图所示
我们可以写一个程序进行探究
UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
[viewA setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:viewA];
NSLog(@"viewA - %@",NSStringFromCGRect(viewA.frame));
UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
[viewB setBackgroundColor:[UIColor yellowColor]];
[viewA addSubview:viewB];
NSLog(@"viewB - %@",NSStringFromCGRect(viewB.frame));
UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[viewC setBackgroundColor:[UIColor redColor]];
[self.view addSubview:viewC];
NSLog(@"viewC - %@",NSStringFromCGRect(viewC.frame));
这个程序在我们看来视图B和C的起点是相同的,但实际上B的起点为(50,50),C的起点为(100,100)
bounds
如果我们将打印出来的内容改为bounds呢,那么我们就会发现。bounds的起点永远为(0,0),由此我们可以知道bounds表示的默认位置位置为当前视图的左上角的位置。
修改bounds位置
我们尝试着更改一个viewC之中bounds的位置,会发现视图在屏幕之中的位置根本没有发生改变,但是如果改变viewA的bounds为
viewA.bounds = CGRectMake(50, 50, 300, 300);
则会出现以下情况
这是为什么呢?借用大佬博客之中的图片,能够很好的诠释这个问题
修改前:
修改后:
可以看到我们修改了viewA的bounds的位置,viewB的位置发生改变,是因为viewB不再将viewA的左上角当作坐标系,而是viewA的左上角坐标变为了(0,100)
总结一下可以得修改bounds的位置实质上就是修改了子视图在frame之中参考父视图的坐标原点的位置
修改bounds大小
我们设想一下,如果修改的是frame之中的大小,那么就是控制了视图的大小,但是视图左上角的坐标位置并不会发生改变,那么bounds又是不是同理呢?
我们做一个实验就知,仍然是上面的代码,我们将viewB的frame和bounds分别做一下改变
修改frame大小
viewB.frame = CGRectMake(viewB.frame.origin.x, viewB.frame.origin.y, 100, 100);
和我们刚刚说的一样,viewB以左上角为基准,上边和左边的长度缩短了100,和viewC重叠在了一起
修改bounds大小
这里我们使用set的方法来重新设置bounds属性
[viewB setBounds:CGRectMake(viewB.bounds.origin.x, viewB.bounds.origin.y, 100, 100)];
如果bounds的作用效果于frame相同的情况下,那么打印出来的frame以及viewB和viewC的位置情况应该与上相同。
可是从结果上来看,viewB并没有和viewC重合,反倒是viewB的frame也发生了改变,而且位置相对于viewA是居中的,那么我们可以合理猜测,bounds大小的修改是会使得view不变中心点,长宽根据中心点来进行相对应的缩放。
那我们将viewB的center修改一下,按照我们的猜想修改至viewC的中心即可让viewC遮挡住B,注意center的位置也是相对于父视图的,所以我们做出以下修改
viewB.center = CGPointMake(100, 100);
区别总结
frame
frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置。
frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变。
bounds
bounds改变位置时,改变的是子视图的坐标系位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角。
bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就像缩放一样。