最近一直在学 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 课程 的图来直观地展示三者的关系。

UIView.frame 以及 UIView.bounds

下面是我自己用 Playground 写了两个 UIView 来详细解释。

首先创建了两个矩形的 UIView,

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

以上是代码。

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

最新文章

  1. Linux tricks
  2. c# 筛选进程命令行,得其ProcessId(唯一标示符,简称pid),再通过pid结束进程
  3. 【leetcode】Wildcard Matching(hard) ★ 大神太牛了
  4. Excl 的一些用法--如何给很多列赋同一个值
  5. 爬虫学习----pattern
  6. 浅析jQuery框架与构造对象
  7. 初步掌握Yarn的架构及原理
  8. 解决mac-osx10.11下无法安装wxPython2.8-osx-unicode-2.8.12.1的问题
  9. vsftp访问异常
  10. Android 手机红外遥控器实现(转)
  11. myeclipse自动保存修改代码
  12. 面试必问---HashMap原理分析
  13. SQLServer之创建分区视图
  14. 在C++中,子类重载一个操作符时,如何调用父类被重载的操作符函数
  15. Python中字符串的操作
  16. BeanPostProcessor出现init方法无法被调用Invocation of init method failed
  17. PLSQL developer 连接不上64位Oracle 解决办法
  18. python学习之基本数据类型
  19. Spring Advice
  20. Spring整合Hibernate(转)

热门文章

  1. Activity篇章参考
  2. windbg命令学习4
  3. Cortex-M3学习日志(四) -- UART0实验
  4. poj 3323 Matrix Power Series (矩阵乘法 非递归形式)
  5. 利用虚拟光驱实现 将WINDOWS文件供虚拟机中的UBUNTU共享
  6. inotify
  7. AngularJs (二) 搭建Deployd 服务爬坑
  8. BOW
  9. 全球最快的JS模板引擎
  10. 小鱼提问2 属性访问器中get,set再用public修饰行吗,private呢?