转自http://www.cocoachina.com/ios/20140925/9755.html

在iOS开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤其是bound很绕,很难理解。

一、首先,看一下公认的资料

先看到下面的代码你肯定就明白了一些:

1
2
3
4
5
6
-(CGRect)frame{
    return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
    return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}

很明显,bounds的原点是(0,0)点(就是view本身的坐标系统,默认永远都是0,0点,除非调用了setbounds函数),而frame的原点却是任意的(相对于父视图中的坐标位置)。

二、再看一下斯坦福iOS教程视频中的图片

翻译如下:

frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)
bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
center:该view的中心点在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)

三、下面阐述一下frame和bound的区别

frame就容易理解一些:frame的(frame.origin.x,frame.origin.y)就是相对于父坐标系的偏移量。

bounds稍微有点费解,稍不留神,想的多了,就会绕进去。每个view都有一个本地坐标系统。这个坐标系统作用比较重要,比如触摸的回调函数中的 UITouch里面的>坐标值都是参照这个本地坐标系统的坐标。当然bounds这个属性也是参照这个本地坐标系统来的。

其实本地坐标系统的关键就是要知道的它的原点(0,0)在什么位置(这个位置又是相对于上层的view的本地坐标系统而言的,最上层view就是 window它的本地坐标系统原点就是屏幕的左上角了)。

通过修改view的bounds属性可以修改本地坐标系统的原点位置。

所以,bounds的有这么一个特点:

它是参考自己坐标系,它可以修改自己坐标系的原点位置,进而影响到“子view”的显示位置。

四、demo论证

1
2
3
4
5
6
7
8
9
10
    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
    [view1 setBounds:CGRectMake(-30, -30, 200, 200)];
    view1.backgroundColor = [UIColor redColor];
    [self.view addSubview:view1];//添加到self.view
    NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));
     
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    view2.backgroundColor = [UIColor yellowColor];
    [view1 addSubview:view2];//添加到view1上,[此时view1坐标系左上角起点为(-30,-30)]
    NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));

这段代码没什么特别的地方。view1加入view中,view2加入view1中。代码第二行,对view1进行了setBounds设置。注释和打开这行代码的效果如图:

1
[view1 setBounds:CGRectMake(-30, -30,200,200)];

这行代码起到了:让view2的位置改变的作用。为何(-30,-30)的偏移量,却可以让view2向右下角移动呢?

这是因为setBounds的作用是:强制将自己(view1)坐标系的左上角点,改为(-30,-30)。那么view1的原点,自然就向在右下方偏移(30,30)。

上面代码控制台输出如下:

(log输出日志表明,每个新的view默认的bounds其实都是(0,0),且bounds的width和height都是跟frame一致)

事情还没完

上面代码中view和bounds的大小都是一样的。如果view的frame和bounds不是一样大小,又会如何呢?

就上面的代码段,将view1的bounds改大!例如:

1
[view1 setBounds:CGRectMake(-30, -30, 250, 250)];

log显示:view1的frame已经被修改了。这是因为setBounds的问题。

frame定义了一个相对父视图的一个框架(容器),bounds则是真实显示区域。如果,bounds比frame小了,可以放到框架(容器)里。如果bounds比frame大,感觉frame被“撑大”了。frame变成了{{25, 25}, {250, 250}}了。25是如何得出的?bounds比frame长,宽各大了50像素,那么四条边平衡一下,各溢出“25”像素。如图所示:

五、结论

bounds的有以下两个特点:

1. 它可以修改自己坐标系的原点位置,进而影想到“子view”的显示位置。这个作用更像是移动原点的意思。

2. bounds,它可以改变的frame。如果bounds比frame大。那么frame也会跟着变大。这个作用更像边界和大小的意思。

可以推测一下,setBound第一个特性可以用于view的滑动,手势动作。第二个特性如何使用呢?从网上找到一个案例:可以将下图中cell拉伸:

代码如下,重写cell的layoutSubviews方法即可:

1
2
3
4
5
6
7
8
9
10
11
// MyCustomUITableViewCell.h
 
- (void)layoutSubviews
{
    self.bounds = CGRectMake(self.bounds.origin.x,
                             self.bounds.origin.y,
                             self.bounds.size.width - 50,
                             self.bounds.size.height);
 
    [super layoutSubviews];
}

参考的文章列表:

http://blog.csdn.net/mad1989/article/details/8711697

http://natashatherobot.com/ios-frame-vs-bounds-resize-basic-uitableview-cell/

 
 

bounds与frame的区别及setBounds的使用的更多相关文章

  1. 深入探究frame和bounds的区别以及setbounds使用

    [转自]http://blog.csdn.net/hherima/article/details/39501857 在iOS开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bou ...

  2. Objective-C日记-Bounds和Frame

    今天在学习有关UIView时,关于Bounds和Frame的问题困扰多时,今日研究了一翻,有所收获,遂记之. 一.问题来源 网上有关bounds和frames的比较的文章主要就是一篇:http://b ...

  3. UIView 中bounds和frame的差别

    搞iOS开发的童鞋基本都会用过UIView,那他的bounds和frame两个属性也不会陌生,那这两个有什么实质性的区别呢? 先看到下面的代码你肯定就明白了一些: -(CGRect)frame{    ...

  4. 使用iframe的优缺点,为什么少用iframe以及iframe和frame的区别。

    注:HTML5不再支持使用frame,iframe只有src 属性一.使用iframe的优缺点优点:1.程序调入静态页面比较方便;2.页面和程序分离;缺点:1.iframe有不好之处:样式/脚本需要额 ...

  5. html/css基础篇——iframe和frame的区别【转】

    转自共享圈的使用iframe的优缺点,为什么少用iframe以及iframe和frame的区别.其中本人不认同的地方有做小修改 注:HTML5不再支持使用frame,iframe只有src 属性 一. ...

  6. iOS开发——项目篇—高仿百思不得姐 05——发布界面、发表文字界面、重识 bounds、frame、scrollView

    加号界面(发布模块) 一.点击加号modal出发布模块,创建控件,布局控件1)使用xib加载view,如果在viewDidLoad创建控件并设置frame 那么self.view 的宽高 拿到的是xi ...

  7. IOS中bounds和frame

    * 用bounds和frame来修改尺寸是有一些小区别的 三.isEqual:方法 1> 系统会根据对象isEqual方法的返回值来决定两个对象是否相同 * 比如判断对象a和b是否相同,就会查看 ...

  8. bounds 和 frame

    使用环境: 一个UIView 添加xib View 时需要注意使用 frame and bounds 代码: frame 和 bounds 对比 样式对比 其实说白了就是 frame: 该view在父 ...

  9. 详解iframe与frame的区别

    iframe与frame的区别 一.使用iframe的优缺点 优点: 1.程序调入静态页面比较方便; 2.页面和程序分离; 缺点: 1.iframe有不好之处:样式/脚本需要额外链入,会增加请求.另外 ...

随机推荐

  1. k8s+jenkins

    1 server 的port , targetport, nodeport的区别 targetport为容器的暴露端口,为最后端的端口 port可以理解为pod的端口,pod是容器的外层,该端口可以在 ...

  2. 【leetcode】1043. Partition Array for Maximum Sum

    题目如下: Given an integer array A, you partition the array into (contiguous) subarrays of length at mos ...

  3. linux运维、架构之路-linux定时任务

    1.基础优化之开机启动服务优化 使用awk拼接的方式 [root@cache01 ~]# chkconfig |egrep -v "crond|network|sshd|rsyslog|sy ...

  4. Python3解leetcode Path Sum III

    问题描述: You are given a binary tree in which each node contains an integer value. Find the number of p ...

  5. android开发里跳过的坑——GridView使用Glide加载图片不显示

    用grideview显示本地图片列表,用了Glide加载框架,具体调用如下: Glide.with(mContext).load(Uri.fromFile(file)).into(imageView) ...

  6. 如何判断WebBrowser浏览器网页加载完成

    在工作中遇到了这样的问题,那就是要判断WebBrowser浏览器网页是否加载完成,通过搜索发现网友们解决这一问题的几种方法,但都不能解决实际问题,现在我们就来看看网友们是如何解决这一问题的. 一.通过 ...

  7. div拖拽的问题

    今天看到一篇写的很好的文章,摘抄如下: 思路 父盒子相对定位,子元素,也就是被拖拽的元素绝对定位 当鼠标在子元素中按下时,绑定鼠标移动事件,根据鼠标位置改变元素位置 设置鼠标当前位置(offsetX, ...

  8. React Hook:使用 useEffect

    React Hook:使用 useEffect 一.描述 二.需要清理的副作用 1.在 class 组件中 2.使用 effect Hook 的示例 1.useEffect 做了什么? 2.为什么在组 ...

  9. CentOS-7.4(1708)release notes发行注记

    Red Hat Enterprise Linux 当前的最新版本是 7.3. Red Hat Enterprise Linux 7 当前仅支持 64 位CPU:64-bit AMD.64-bit In ...

  10. Fault Contract

    The Fault Contract sample demonstrates how to communicate error information from a service to a clie ...