iOS UIView

主要内容:

  1. frame 与 bounds 的区别

frame 与 bounds 的区别

先给个定义:

  • frame
    该view在 superView 坐标系统中的位置和大小。(参照点是父亲的坐标系统)
  • bounds
    该 view 在自身坐标系统中的位置和大小。(参照点是本身坐标系统)

上面这段话可能有点难以理解。来举个例子:我们假设有一个绝对的、以显示器左上角作为坐标原点的坐标系 Z,考虑以下两种情况:(代码不长,请仔细看代码)

第一种情况:

  • 代码:
- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view setBackgroundColor:[UIColor grayColor]];

    UIView *view1 = [[UIView alloc] init];
    [view1 setFrame:CGRectMake(50, 50, 200, 200)];
    [view1 setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:view1];
    // 则self.view的子视图view1在绝对坐标系Z中的坐标是(50, 50)

    UIView *view2 = [[UIView alloc] init];
    [view2 setFrame:CGRectMake(50, 50, 50, 50)];
    [view2 setBackgroundColor:[UIColor greenColor]];
    [view1 addSubview:view2];
    // 则view1的子视图view2在绝对坐标系Z中的坐标是(100, 100)
}
  • 结果:

第二种情况:

在第一种情况的基础上增加下面这行代码修改 view1 的 bounds:

[view1 setBounds:CGRectMake(50, 50, 200, 200)];
// 即把view1的bounds.origin从 (0, 0)修改为(50, 50)
// 则view1的子视图view2在绝对坐标系Z中的坐标变成了(50, 50)
  • 结果:

比较

比较以上两种情况,其实我们可以发现:设置了 view1frame 之后,实际上已经确定了 view1 的位置和大小,此时 view1 的起始位置(最左上角的点)是确定了的。当我们修改 bounds 的时候,实际上不会对 view1 的位置有任何影响,而是移动了 view1 的自身坐标系。在此例中,view1 起始位置的绝对坐标为(50, 50)已经确定,设置 view1.bounds.origin 为(50, 50)的时候,表示 view1 的起始位置在它自身坐标系的(50, 50)处,而此时 view1 的位置不动,实质上是将坐标系原点往左上方向移动了

总结

因此我们可以知道,对一个 view 来讲,它在 superView 中的位置仅仅由 frame 决定,而它的 bounds 仅仅能决定它所有子视图的位置以及它自身的大小。