技术那些开发的事ios学习

iOS 何为bounds,何为frame

2015-04-22  本文已影响379人  _赖笔小新

从开始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改变,那么子视图的参照也变了,子视图的位置也会发生变化。

我们来看个例子:

306C09A8-43B8-435F-B67D-14EC87168D68.png

这里我们只设置了father view 的frame和son view的frame。结果如我们预期的。

接下来我们改变父视图的bounds,看看会发生什么。代码如下所示:

    CGRect fatherViewBounds = fatherView.bounds;
    fatherViewBounds.origin.x -= 10;
    fatherViewBounds.origin.y -= 10;
    fatherView.bounds = fatherViewBounds;
6E68A542-1F4C-4732-B236-040DEC013EAB.png

结果就是father view的所有子view(son view、label)都在x、y上偏移了10个point。

为什么会这样?

默认情况下当前view的坐标轴即bounds实在左上角(0, 0)的位置。如果我们把bounds的x,y改变,就像上面那样,那么原来的(0, 0)就变成了(-10, -10)。那么father view 的坐标轴就变成了下面这样

050AC34D-9D16-411E-AE41-DE519FD22075.png

也就是说当我们改变bounds的时候,我们改变的是它的坐标系统。受影响的是参照它来定位的子视图。

不知道我有没有讲清楚😄

上一篇下一篇

猜你喜欢

热点阅读