翻译文档上的bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小区别主要在坐标系这一块。很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。绝对坐标。。。相对坐标。。。比如屏幕旋转的时候就要以相对来重绘。 frame 如果一个按钮,是在表格里,按钮的frame 的坐标也是相对的,并不是相对屏幕,也就是说是相对坐标,不是绝对坐标我也想知道任何一个uiview如何求得它在屏幕上的坐标。view 的frame是view在它的super view 的位置与尺寸。view 的bounds可以用来帮助它的subview来定位的 ,layoutSubviews。Frame  is  in  terms  of superview's  coordinate  system   框架是从父视图的坐标系统Bounds   is in  terms  of   local  coordinate  system是在局部坐标系统

frame和bounds是UIView中的两个属性(property)。

frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

-(CGRect)frame{

returnCGRectMake(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)点,而frame的原点却是任意的。frame 如果一个按钮,是在表格里,按钮的frame 的坐标也是相对的,并不是相对屏幕,也就是说是相对坐标,不是绝对坐标。frame 是相对坐标。bounds是绝对坐标。Android的开发过程中,绝对坐标,这样画出来的位置都是相对于屏幕的而不是相对于控件的 什么是绝对坐标值,相对坐标值?绝对坐标是:X,Y    就是相对于坐标原点的。                   例如(15,20)相对坐标是:@X,Y   就是相对于参考点(可以是自己设定的一个点)。                    例如(15,20)相对于参考点(1,1)的坐标,表示:@14,19                           (15,20)相对于参考点(-1,-1)的坐标,表示:@16,21bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小.区别主要在坐标系这一块。很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。

转至http://blog.csdn.net/chang6520/article/details/7921251

关于UIView中的frame、bound的变化

对于刚刚接触iOS开发不久的新手来说,UIView中的frame、bound和center的确容易产生思维的误区,尤其是想要对视图类的bound这个概念若想要理解深入,真的要花一番功夫。在经过一系列查阅参考资料和动手试验之后,终于对这几个概念产生了一些领悟,记录于此可供有同样困惑的同学参考。

首先是我参考过的一篇博文http://blog.csdn.net/mad1989/article/details/8711697,里面对这几个概念做了一些解释可是我依然觉得有些困惑没能得到解释清楚。所以,剩下的只有通过我们自己的实验来探索了。

首先贴一篇博文做参考,http://blog.csdn.net/mad1989/article/details/8711697;这篇博文已经对UIView的frame和bound做了一些阐述,但是我依然觉得有些地方有些语焉不详,因此在这里通过自己的一些实验对其做一些补充,以期让读者不再有任何的疑惑。

在xcode中新建一个空工程,在AppDelegate.m文件的didFinishLaunchingWithOptions:(NSDictionary *)launchOptions函数中加入下面的程序

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];

[view1 setBounds:CGRectMake(25, 25, 200, 200)];

[self.window addSubview:view1];

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

view2.backgroundColor = [UIColor redColor];

[view1 addSubview:view2];

NSLog(@"view1 frame:%@========view1 bounds:%@========view1 center:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds),NSStringFromCGPoint(view1.center));

NSLog(@"view2 frame:%@========view2 bounds:%@========view2 center:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds),NSStringFromCGPoint(view2.center));

[view1 release];

[view2 release];

程序执行之后将会在主屏幕上显示我们新添加的两个视图对象,如下图所示。

除此之外,在控制台输出窗口上,还会显示以下内容:

view1 frame:{{50, 100}, {200, 200}}========view1 bounds:{{0, 0}, {200, 200}}========view1 center:{150, 200}

view2 frame:{{0, 0}, {100, 100}}========view2 bounds:{{0, 0}, {100, 100}}========view2 center:{50, 50}

在上述程序中,我们在主窗口上添加了两个矩形视图对象,父视图为绿色,起始点为(50,100),长宽为(200,200)。在添加红色的子视图view2的时候,由于我们采用的初始化方法是initWithFrame(不存在initWithBound方法),view2就设置了其在父视图坐标系中的相对位置和大小,即相对于父视图坐标,起始点为原点(即左上角),尺寸为(100,100)。若改变其初始frame,则其相对于父视图的位置也会改变。如将程序中view2产生的代码改为:

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 80, 80)];

则程序运行结果如下:

同时,view2的控制台输出信息也相应变为:view2 frame:{{20, 20}, {80, 80}}========view2 bounds:{{0, 0}, {80, 80}}========view2 center:{60, 60}。我们也发现,在默认情况下,视图的bound起始点一直是(0,0);

而现在我想到的一点是,如果我们改变了视图对象的bound成员,那该对象将会产生怎样的变化呢?众所周知,bound是在子视图自己的坐标系中表示视图的位置大小,那更改后会对其本身产生什么样的影响呢?为求证这些问题,在view2建立之后,添加一条语句:

[view2 setBounds:CGRectMake(50, 50, 100, 100)];

同时撤销掉刚刚对其frame的改动,依旧为(0,0,100,100)。程序运行的结果如下图:

跟第一张图相比,完全没有任何变化。也就是说,改变了bound的起始点,并不会造成视图本身相对于父视图的位置移动。因为,像刚才这样将bound起始点设为(50,50),是将子视图自身坐标改变。而视图在创建的时候,initWithFrame函数参照父坐标的位置构建子视图,所以子视图本身的坐标的改动,并不会影响自身。那bound起始点的不同,究竟影响的是谁呢?

为了探寻这个问题,我们在view1创建之后,新加入下面这条语句:

[view1 setBounds:CGRectMake(25, 25, 200, 200)];

此时view1的自身坐标被改变。程序运行的结果如下图所示:

从图中可以看出来,绿色父视图的位置依然没有改变,但是红色的子视图的位置向左上方经纬度各移动了25像素的距离。为什么会出现这种现象呢?父视图bound的起始点设为了(25,25),也就意味着绿色方块的左上角的像素点的本地坐标不再是(0,0),而是(25,25)。而子视图的起始渲染位置在父视图的(0,0)点,相应的也就移动到父视图的左上角了。

为了验证这个结论,我们再次修改以下程序,将view2的绘制语句改为:

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(25, 25, 100, 100)];

然后运行一下程序,显示结果如下:

可见,经过绘制子视图的时候相对于父视图的补偿,子视图和父视图的右上角又重合了,这也从另一个角度证明了我们的结果。

转载于:https://blog.51cto.com/9492221/1565846

【转】frame与bounds的区别比较相关推荐

  1. frame 和 bounds的区别

    这篇是见过写的最为详细易懂的文章: frame与bounds的区别详解 - 简书 简单概括下: 1.bounds和frame都是属于CGRect类型的结构体,系统的定义如下,包含一个CGPoint(起 ...

  2. frame与bounds的区别比较

    翻译文档上的
bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小
区别主要在坐标系这一块.

很明显一个是自己为原点的坐标 ...

  3. 完结之frame和bounds的区别

    回顾上集,我写了frame和bounds在x.y上的区别,以及简单的描述frame的width和height.这次,继续前集但又不同于前集.继续前集,我是想把bounds的width和height讲完 ...

  4. iOS bug 日志 -frame 和 bounds的区别

    使用显式动画,如果设置layer 的bounds和frame效果是不一样的 如果设置 self.layer.bounds = CGRectMake(0, 0, width, width); 效果如图 ...

  5. frame 和bounds 的区别

    二者都是方的. bounds 对内 不包含自身 相对 superView的 位置 frame 对外 包括自身相对 superView的坐标 self.bounds= CGRectMake(0,0,se ...

  6. frame、bounds表示大小和位置的属性以及center、position、anchorPosition

    在iOS开发开发过程中经常会用到界面元素的frame.bounds表示大小和位置的属性以及center.position.anchorPosition等单纯表示位置的属性.这些属性究竟什么含义?彼此间 ...

  7. ios开发之UIView的frame、bounds跟center属性的区别(附图)

    博文暂时想到什么写什么,不顺理成章,不顺章成篇. 先看几个概念 坐标点Poit:向右侧为X轴正方向的值x,原点下侧为Y轴正方向的值y 大小Size:由宽度width和高度height构成,表示一个矩形 ...

  8. iOS中frame和Bounds之间的区别

    frame frame是每个view必备的属性,代表的是当前视图的位置和大小,没有设置他,当前视图是看不到的.位置需要有参照物才能确定,数学中我们用坐标系来确定坐标系中的某个点的位置,iOS中有他特有 ...

  9. iOS开发-View中frame和bounds区别

    开发中调整View的时候的经常会遇到frame和bounds,刚开始看的时候不是很清楚,不过看了一下官方文档,frame是确定视图在父视图中的位置,和本身的大小,bounds确定可以确定子视图在当前视 ...

最新文章

  1. Linux BSP非标准HDMI分辨率
  2. SpringCloud(第 029 篇)配置客户端 ConfigClient 接入配置服务端
  3. JAVA NIO存在的问题
  4. softAP配网:用Android手机为linux无屏设备输入wifi密码
  5. python3 字符串 转 ascii码
  6. [Vani有约会]雨天的尾巴 (线段树合并)
  7. 再见,2014;你好2015
  8. 达梦数据源配置_达梦DM8 数据库 DEM(Dameng Enterprise Manager) 安装配置
  9. 【ArcGIS遇上Python】ArcGIS Python实现Modis NDVI批量求年最大值
  10. 深度学习笔记_基本概念_梯度下降及示例代码
  11. php跳转图片_HTML点击图片跳转到新页面怎么实现?(示例)
  12. SQL Server实现列转行
  13. win10里面的linux可以分屏吗,Win10上下分屏怎么弄 教你让Win10上下分屏的方法
  14. 如何在shell中实现 backspace
  15. Windows图像标注软件安装与使用(Vott、labelImg、labelme)
  16. php将一维数组转换成二维数组
  17. spring boot runner,destory监听
  18. pyqt win32发送QQ消息
  19. python 持续集成 教程_使用Travis进行持续集成
  20. 如何优化cocos2d程序的内存使用和程序大小

热门文章

  1. 披一张机器皮,智能就有了?!
  2. CMU计算机学院院长Andrew Moore离职,下一任院长人选未定
  3. 大开眼界:Facebook做了一个会“开眼”的AI,拯救眨眼照片
  4. 谷歌TPU2代有望取代英伟达GPU?测评结果显示…
  5. Facebook正在追踪你,哪怕你不是用户丨扎克伯格国会听证第二日
  6. “每天AI资讯这么多!该看哪些?”推荐一份优质资料清单
  7. Java基础(1):Java简介和开发环境配置
  8. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击
  9. python中列表操作
  10. Cache-Control的一些认识