今天在学习有关UIView时,关于Bounds和Frame的问题困扰多时,今日研究了一翻,有所收获,遂记之。

一、问题来源

网上有关bounds和frames的比较的文章主要就是一篇:http://blog.csdn.net/mad1989/article/details/8711697,核心思想是bounds的坐标系是相对于自己而言,而frames的坐标系是相对于父视图,主要的演示代码如下:

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
[view1 setBounds:CGRectMake(-20, -20, 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坐标系左上角起点为(-20,-20)]
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));

如果按以上代码运行可以得到期望的结果:

2017-03-12 21:32:04.474 BoundsAndFrame[5910:450792] view1's frame {{20, 20}, {200, 200}}=========view1 bounds:{{-20, -20}, {200, 200}}

2017-03-12 21:32:04.475 BoundsAndFrame[5910:450792] view2 frame:{{0, 0}, {100, 100}}=========view2 bounds:{{0, 0}, {100, 100}}

我们想将这个图形结果进行一些更改:

1、将红色区域变成正方形,并将其宽度加长一倍,变成400。

2、将黄色图形向下移动,使其上边缘距红色图形内部边缘底部为10。如下图所示:

将其代码更改为:

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
[view1 setBounds:CGRectMake(-20, -190, 400, 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坐标系左上角起点为(-20,-20)]
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));

但得到的结果如下所示,并不是我们想要的。

2017-03-12 21:40:57.170 BoundsAndFrame[5950:457772] view1's frame {{-80, 20}, {400, 200}}=========view1 bounds:{{-20, -190}, {400, 200}}

2017-03-12 21:40:57.170 BoundsAndFrame[5950:457772] view2 frame:{{0, 0}, {100, 100}}=========view2 bounds:{{0, 0}, {100, 100}}

二、问题分析

按上面比较bounds和frames区别的那篇文章来讲,

[view1 setBounds:CGRectMake(-20, -190, 400, 200)];

这个语句中的setBounds方法的功能是将本view的bounds坐标原点强制设置成(-20,-190),并将CGRect的宽和高设置成(400,200)。

按计算,被转换过后的view1的frame坐标应该还是(20,20),宽高(400,200)。

三、问题解决

那篇比较bounds和frames的文章中有一个重要的问题没有提到,最后在Apple的API Reference中找到答案:

Changing the bounds size grows or shrinks the view relative to its center point.(对形状边界进行扩大或缩小,是相对于其中心点进行的。)

我概括使用bounds属性进行坐标和大小变换的原则:以中心为原点进行缩放,先宽高后坐标。

是要先进行宽和高的变换,比如这上面那句

[view1 setBounds:CGRectMake(-20, -190, 400, 200)];

宽度的变换是以中心为原点,向两边各延长100,高为200不变。

大小变换完成之后,再将得到的图形的原点(左上角顶点)的bounds坐标设置为(-20,-190)。

这样,再进行计算,便得到了上述结果。

Objective-C日记-Bounds和Frame的更多相关文章

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

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

  2. IOS中bounds和frame

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

  3. bounds 和 frame

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

  4. UIView 中bounds和frame的差别

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

  5. bounds与frame的区别及setBounds的使用

    转自http://www.cocoachina.com/ios/20140925/9755.html 在iOS开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤 ...

  6. iOS bounds、frame之间的关系

    这几个都是在ios程序中,经常会注意到的一些小细节,能否真正了解这些,对写ios程序也有很大的好处. frame 是UIView中表示此view的一个矩形面积,包括了view在它的superview中 ...

  7. iOS界面篇 - bounds和frame的相同和区别

    相同点: 他们都是CGRect类型,且拥有属性origin(x, y),  size(weight, height) 不同点: bounds是你画的视图的边界,和父视图没有半毛钱关系 frames则一 ...

  8. bounds 和frame区别

    仔细看下这个图就知道了

  9. iOS bounds vs frame

    斯坦福iOS开发课程的白胡子大叔的PPT解释得淋漓尽致!

随机推荐

  1. easyui datagrid分页参数获取

    $("#btnDataExport").click(function () { $.messager.show({ title: '导出提示', msg: '每次导出一页商户数据, ...

  2. ImageView及其子类(一)

    ImageView继承自View组件,它的主要功能是用于显示图片——实际上这个书法不太严谨因为他能显示的不仅是图片,任何Drawable对象都可以使用ImageView来显示.除此之外,ImageVi ...

  3. zoj3823--构造

    题目大意: 在n*n(n<=512)的网格上,从边界某个点出发,经过每个点一次且回到边界上,构造出一种方案使拐弯的数量至少为n*(n-1)-1次. 构造方法:我们可以手算出n=2~6时的方案. ...

  4. webSocket错误收集

    关于 使用WebSocket报如下错误, Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': already in ...

  5. 蓝桥网试题 java 基础练习 矩形面积交

    ------------------------------------------------------------------------------------------- 思路见锦囊2 - ...

  6. 学习计划(一)——JavaScript

    一:与前端之缘 大一时除了上课和社团外不知道要学点什么,但是又不想睡觉打游戏,常常就是啥都想学,photoshop,premiere,After Effects都学,但始终没有明确的目标. 大二时一直 ...

  7. array_count_values:返回数组中所有值出现的次数

    $arr1 = ['a','b','c','d','e','e','a','a']; $arr = array_count_values($arr1);   echo '<pre>'; p ...

  8. 纯js实现html转pdf

    项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格.svg图片和样式.简而言之,就是希望像截图一样,把整个页面截下来,然后保存成pdf.咋不上天呢--查了一下 ...

  9. Android系统之灯光系统--通知灯深入分析

    Android通知灯的深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 getSystemService(通知服务) 构造notification 类别 其他参数(颜色,onMS,of ...

  10. 做一个360度看车的效果玩玩(web)

    前几天在 Lexus 官网看到有这样的一个效果:http://www.lexus.com.cn/models/es/360 于是顺手打开控制台看了下他们是怎么做的,发现使用的技术还是比较简单的,通过背 ...