最近一直在学 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

UIView 中 frame, bounds, center 属性的关系的更多相关文章

  1. 初见IOS的UI之:UI控件的属性frame bounds center 和transform

    这些属性,内部都是结构体:CGRect CGPoint CGFloat 背景知识:所有的控件都是view的子类,屏幕就是一个大的view:每个view都有个viewController,它是view的 ...

  2. iOS编程(双语版)-视图-Frame/Bounds/Center

    1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置. (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过 ...

  3. frame,bounds,center分析

    采用CGPoint来表示坐标系X,Y位置,创建一个坐标的方式为:CGPoint point=CGPointMake(x,y) CGSize用来表示视图的宽度和高度,可以用CGSizeMake(widt ...

  4. js中Frame框架的属性获取(1)

    js中window和document对象及如何操作iframe 一. window对象 . 什么是window对象? Window对象表示浏览器打开的窗口.如果文档包含iframe或者是frame标签 ...

  5. iOS--------坐标系统(UIView的frame、bounds跟center属性)

    1.概要翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下: frame:描述当前视图在其父视图中的位置和大小. bounds:描述当前视图在其自身坐标系统中的位置和大小. center:描述 ...

  6. 详解UIView的frame、bounds和center属性

    From: http://ios.wpjam.com/2011/08/29/uiview-frame-bounds-center/ 1.概要 翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下 ...

  7. 手写控件,frame,center和bounds属性

    一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View ...

  8. iOS开发UI篇—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  9. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

随机推荐

  1. php中mysql语句的基本写法

    php中mysql语句的基本写法 php作为一门后台语言必须要与mysql数据库打交道,做到将内容存储到数据库以及数据库数据读写的操作,那么下面就来说下最近学习的一些东西: 在具体将之前先说一下编码的 ...

  2. GoF——状态模式

    状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. “状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把状态的判断逻辑转移到表示不同状态的一系列类 ...

  3. linux下挂载NTFS分区错误修复

    今天在linux下打开win的NTFS硬盘总是提示出错了,而且是全部的NTFS盘都出错,其中sda1错误显示如下: Error mounting /dev/sda1 at /media/wangbo/ ...

  4. 提高Delphi的编译速度(bpl和bcp)

    delphi的编译速度提高(一) 此博文为原创,转载请注明出处 作者 :二娃 此博文的内容我曾经回答群内和论坛内的网友提问时回答过,现在写第一部分,第二部分,我再给出一个终极的提高速度的方法 我用过d ...

  5. 《我是一只IT小小鸟》 读后感

    <我是一只IT小小鸟>一只是我想读list中一个本,但是上次去当当买的时候,竟然缺货了...昨天监考,实在无聊,就上网看电子书了,一天就看完了,看得有点仓促,所以理解估计不深. 1.刘帅: ...

  6. #include <algorithm>

    1 adjacent_find 查找重复的元素 2 find_if 查找符合条件的第一个元素 3 find_if_not 查找不符合条件的第一个元素 4 for_each 可以遍历每一个元素 5 pa ...

  7. mongodb查询关于大于小于的用法;

    mongoDB查询操作符: http://www.runoob.com/mongodb/mongodb-operators.html 项目中需要的场景是这样的,每个人每天只能领取一张明信片,换句话说, ...

  8. python字符串转义与正则表达式特殊字符转义

    最近在自学python,字符串和正则表达式的特殊字符转义有点混淆,做个笔记简单总结一下. 1.普通字符串转义 在字符串中使用特殊字符时,要用反斜杠(\)转义字符.例如:'Let\'s go!',这里对 ...

  9. 【我所認知的BIOS】—&gt;ADU.exe

    [我所認知的BIOS]—>ADU.exe By LightSeed 2009-5-12 1.概要 在學習的過程中,肯定會要用不少的工具,作為底層的engineer那麼用的工具大多是DOS下.在D ...

  10. 数据结构中La表的数据合并到Lb表中

    实验描述:La表中的数据为(3,5,8,11)  Lb 表中的数据为(2,6,8,9,11,15,20) 将La表中的数据而不存在Lb表的数据插入到Lb表中,从而实现并集操作. 出现的问题:最后实现的 ...