您的位置:首页 > 产品设计 > UI/UE

iOS UIView

2016-03-18 23:15 363 查看

iOS UIView

主要内容:

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)


结果:



比较

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


总结

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

如果嫌写得太短的话可以参考以下两篇博客(各种详细..):

ios view的frame和bounds之区别(位置和大小) - 其实并不难,是你太悲观 - 博客频道 - CSDN.NET

视图UIView的frame、bounds与center属性 - Puzhi的专栏 - 博客频道 - CSDN.NET
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: