UIView中frame, bounds, center三个属性的关系
2014-09-02 09:38
357 查看
在UIView中,有三个重要的属性:frame, bounds 和 center。这三个属性之间的关系让初学者很难理解。下面我通过个人的理解,说说它们的关系。
先记住下面两句话:
frame的位置是相对父视图来说的,bounds 和 center 是相对自身来说的。bounds 改变 center 不变,center 改变,bounds 也不变。
每一个UIView都有自身的坐标系。默认坐标系起点都是在左上角。往UIView 添加 view 时是根据其坐标系来计算位置的 。
现在看看基本代码:
运行结果:
以上代码很简单,只是简单的添加了两个UIView控件,就不多说了。
现在,我们修改一下greenView的 bounds, 如下代码:
现在,我们来分析一下:
从结果可以看到,blueView相对于greenView像左移动了50。为什么会这样?上面已经说了,每个UIView都有自己的坐标系,而且默认是UIView的左上角。而上面代码将 greenView的 bounds 属性修改为 (50, 0, 100, 200)。这时也就是说 greenView 上的 bounds 相对于自身的坐标系的偏移值是:(50,0),如下图:
(默认情况下)
(修改bounds属性坐标后)
从图中可以看出, greenView 在屏幕上的位置不变,只是其自身的坐标系改变了。所以,在向其添加 blueView时,计算坐标位置就不在是从 greenView的左上角开始计算了。上面,我们只是把 bounds 的 X 坐标修改了。同理,如果把 greenView 的bounds的坐标改为(-10, -30)那其坐标系就会成下图中那样:
现在我们改变一下 greenViewd 下 bounds属性的 宽和高, 如下代码:
运行结果:
可以发现,greenView 不仅大小变化了,而且位置也改变了。出现这个结果的原因很简单:还是上面说的那句话:bounds 改变 center 不变。而我们修改了 greenView 的宽度后,它不能只是想左边拓展或向右边拓展(因为这样的话 center 就改变了),所以为了保持 center 不变只能向两边一起拓展了。于是就有了上面的结果。注:这是自身坐标系没有变,frame
属性变了。
如果修改 center 的位置,那 greenView 也会移动,因为 center 是相对自身来说的。
总的来说,要理解这三者的关系,只要记住上面两句话:
1. frame的位置是相对父视图来说的,bounds 和 center 是相对自身来说的。bounds 改变 center 不变,center 改变,bounds 也不变。
2.每一个UIView都有自身的坐标系。默认坐标系起点都是在左上角。往UIView 添加 view 时是根据其坐标系来计算位置的 。
先记住下面两句话:
frame的位置是相对父视图来说的,bounds 和 center 是相对自身来说的。bounds 改变 center 不变,center 改变,bounds 也不变。
每一个UIView都有自身的坐标系。默认坐标系起点都是在左上角。往UIView 添加 view 时是根据其坐标系来计算位置的 。
现在看看基本代码:
UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 200)]; greenView.backgroundColor = [UIColor greenColor]; [self.window addSubview:greenView]; [greenView release]; UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; blueView.backgroundColor = [UIColor blueColor]; [greenView addSubview:blueView]; [blueView release];
运行结果:
以上代码很简单,只是简单的添加了两个UIView控件,就不多说了。
现在,我们修改一下greenView的 bounds, 如下代码:
CGRect newBounds = greenView.bounds; newBounds.origin = CGPointMake(50, 0); greenView.bounds = newBounds;
现在,我们来分析一下:
从结果可以看到,blueView相对于greenView像左移动了50。为什么会这样?上面已经说了,每个UIView都有自己的坐标系,而且默认是UIView的左上角。而上面代码将 greenView的 bounds 属性修改为 (50, 0, 100, 200)。这时也就是说 greenView 上的 bounds 相对于自身的坐标系的偏移值是:(50,0),如下图:
(默认情况下)
(修改bounds属性坐标后)
从图中可以看出, greenView 在屏幕上的位置不变,只是其自身的坐标系改变了。所以,在向其添加 blueView时,计算坐标位置就不在是从 greenView的左上角开始计算了。上面,我们只是把 bounds 的 X 坐标修改了。同理,如果把 greenView 的bounds的坐标改为(-10, -30)那其坐标系就会成下图中那样:
现在我们改变一下 greenViewd 下 bounds属性的 宽和高, 如下代码:
GRect newBounds = greenView.bounds; newBounds.size = CGSizeMake(200, 200); greenView.bounds = newBounds;
运行结果:
可以发现,greenView 不仅大小变化了,而且位置也改变了。出现这个结果的原因很简单:还是上面说的那句话:bounds 改变 center 不变。而我们修改了 greenView 的宽度后,它不能只是想左边拓展或向右边拓展(因为这样的话 center 就改变了),所以为了保持 center 不变只能向两边一起拓展了。于是就有了上面的结果。注:这是自身坐标系没有变,frame
属性变了。
如果修改 center 的位置,那 greenView 也会移动,因为 center 是相对自身来说的。
总的来说,要理解这三者的关系,只要记住上面两句话:
1. frame的位置是相对父视图来说的,bounds 和 center 是相对自身来说的。bounds 改变 center 不变,center 改变,bounds 也不变。
2.每一个UIView都有自身的坐标系。默认坐标系起点都是在左上角。往UIView 添加 view 时是根据其坐标系来计算位置的 。
相关文章推荐
- UIView 简介(六)视图几何结构和坐标系统 包括frame, bounds和center属性之间的关系
- UIView 中 frame, bounds, center 属性的关系
- iOS-UIView属性之frame和bounds的区别
- 详解UIView的frame、bounds和center属性
- 详解UIView的frame、bounds、center属性
- UIView的bounds和frame属性区别
- 视图UIView的frame、bounds与center属性
- ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
- ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
- ios开发之UIView的frame、bounds跟center属性的区别(附图)
- 视图UIView的frame、bounds与center属性
- uiview的frame,bounds,center的几个关系
- 详解UIView的frame、bounds和center属性
- 详解UIView的frame、bounds和center属性
- iOS--------坐标系统(UIView的frame、bounds跟center属性)
- IOS-Frameworks-UIKit-UIView.h-frame属性和bounds属性
- IOS UIView之frame和bounds属性区别
- Ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
- ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
- 视图UIView的frame、bounds与center属性