UIView 中 frame, bounds, center 属性的关系

最近一直在学 iOS 开发,所以专门创建了这样一个类别,将自己学习中的一些问题整理,记录下来。由于自己是初学者,所以所写的文章非常基础,写这个类别一是为了给自己留下存档,二是为了给和我有同样问题的初学者留下一些学习的线索,三是希望在整理这些文章的过程中可以看到自己一点点的进步。

今天整理的问题是关于在布局方面, UIView 中的 frame, bounds, center 三个属性相关。三个属性都是用来将 view 定位在它的 Superview 上的,而三个又存在着一定的区别。

简介

  • frame 属性是相对一个 UIView 的 Superview 的坐标来定位的,初始的默认值是位于 Superview 的左上角。以横向为 x,向右为正方向;以纵向为 y,向下为正方向;左上角为坐标原点。

  • bounds 是以一个 UIView 自己 的坐标来定位的,坐标的设置同 frame 相同。上面两个属性是一个 矩形 (CGRect) ,并且有 x,y 坐标,x,y 坐标用于确定矩形左上角那一点的位置,来确定这整个矩形的位置。

  • center 与上两者不同。 center 是一个 点(CGPoint) ,它代表着 View 中心的那一点,通过 x, y 的坐标值来确定整个 View 的位置。同 frame 一样, center 也是通过 Superview 的坐标系统来确定位置的。

下来借用一张 Stanford CS193p 课程 的图来直观地展示三者的关系。 between-uiview-frame-bounds-center-3jcne-1

UIView.frame 以及 UIView.bounds

下面是我自己用 Playground 写了两个 UIView 来详细解释。 首先创建了两个矩形的 UIView,

黑色的是 viewA, 红色的是 viewB, viewB 是 viewA 的 subview。

between-uiview-frame-bounds-center-code

以上是代码。 UIView 在创建时使用了 CGRectMake 函数,四个参数分别是 x 坐标, y 坐标, 矩形的宽,矩形的高,并将坐标值赋给 UIView.frame 或者 UIView.bounds
创建 viewB 时将其 frame 的 x,y 值均设置为 200。前面讲过, frame 是相对于 Superview 的坐标系统来定位的。所以将红色的 viewB 放置在了图中的位置。 在代码的 18-26行可以分别清楚地看到两个 View 的 frame, bounds 的 x, y 值。 viewB 中 frame 的x,y 值是相对于 viewA 左上角的距离。但是 viewB.bounds 属性的 x,y 值为0,这就是因为 bounds 是以它自己的坐标系统为参照,由于 viewB 并没有发生旋转等操作,所以 bounds 的 x,y 值均为0。

假设此事创建了一个 viewC 作为 viewB 的 subview, 那么 viewC 的 Superview 也就是 viewB, 它的 frame 也就是以 viewB 为坐标参照物,而不是 viewA, viewB 则是又以 viewA 作为参照物的。曾经犯过这样的问题。说明一下。虽然本来就该这样。

UIView.center

UIView.center 其实没有什么好说的,学习到现在也很经常使用这个属性来定位。
这个属性代表了 UIView 中间的那一点,以这个点的位置来定位。类型是一个 CGPoint

这三个属性有这样的特征: UIView.frame.origin = center - (bounds.size / 2.0) UIView.center = frame.origin + (bounds.size / 2.0) UIView.frame.size = bounds.size

大概讲了一些,写的时候发现叙述好真是困难。英语好的人可以看看这个链接,本文参考自这里。 http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center