从开始iOS,我就一直不理解bounds和frame之间的区别。真的很奇妙,无论看多少相关的blog。
一个View要确定它的位置和大小,那么就必须知道它的 position, 即x,y的坐标,和它的长度,高度。这4个参数都是相对父视图来讲的。我们在程序中为了指定这几个参数,使用的就是view 的 frame这个属性。
UIView * v = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
类似上面这样,非常简单。按理说只是确定view的位置的话只需要frame,我们在编程的时候也确实基本上只会用到frame,但是UIKit还给了一个属性叫bounds,和frame非常类似,但其实它的作用并非改变自身的定位状态。而是改变自身的坐标系。我们知道自视图是参照父视图的坐标系来使用frame定位自身的,那么当父视图的bounds改变,那么子视图的参照也变了,子视图的位置也会发生变化。
我们来看个例子:
这里我们只设置了father view 的frame和son view的frame。结果如我们预期的。
接下来我们改变父视图的bounds,看看会发生什么。代码如下所示:
CGRect fatherViewBounds = fatherView.bounds;
fatherViewBounds.origin.x -= 10;
fatherViewBounds.origin.y -= 10;
fatherView.bounds = fatherViewBounds;
结果就是father view的所有子view(son view、label)都在x、y上偏移了10个point。
为什么会这样?
默认情况下当前view的坐标轴即bounds实在左上角(0, 0)的位置。如果我们把bounds的x,y改变,就像上面那样,那么原来的(0, 0)就变成了(-10, -10)。那么father view 的坐标轴就变成了下面这样
也就是说当我们改变bounds的时候,我们改变的是它的坐标系统。受影响的是参照它来定位的子视图。
不知道我有没有讲清楚😄