剖析OC中的bounds与frame的区别

在OC的UI控件中,我们常常会碰到两个属性frame 与bound,前者相对比较好理解,而bound有时候却比较绕,今天我们来仔细研究下bound的一些特性。

首先,我们来看下下面的代码: 
这里写图片描述 
通过代码,我们可以看出bounds的width值、height值与frame是相等的,只不过origin点的X 、Y默认都为0

这里写图片描述 
这里写图片描述

那么如果我们修改或者重新赋值了bounds值,会发生哪些影响呢?我们来分情况进行讨论:

一 、修改bounds的width值或height值 
当我们给one添加代码 one.bounds = (CGRect){0,0,80,80};通过bounds我们修改了它的width、height值(小于frame),此时在模拟器中两个view的位置变成了: 
这里写图片描述 
这是因为: 
我们通过frame定义了一个相对父视图的一个容器,而bounds显示的是这个容器的实际区域。当bounds比frame小了,实际的显示区域就需要调整。需要注意的是在调整的过程中,容器的中心点是不能改变的 
以上图为例,当one.frame =(CGRect){50,50,100,100}时候,这个容器的中心点坐标就是 (100,100),然后我们执行了one.bounds = (CGRect){0,0,80,80};宽度和高度都小了20,这样子在保持中心点不变的情况下,上下左右都各自缩短10 
同样的,若执行one.bounds = (CGRect){0,0,120,120};中心点仍然是不变的,只不过上下左右都各自增加10 
这里写图片描述

在这里我们看一个比较极端的情况,若我们不设置frame属性,直接设置 
one.bounds = (CGRect){0,0,100,100};看看模拟器中的呈像 
这里写图片描述 
我们明明设定的width、height是100,而现在却看来只有50呢?细心的小伙伴们或许已经发现了!当我们没有设定frame的时候,默认的frame就是(CGRect){0 , 0 , 0 , 0};这个时候我们的中心点就是父容器的左上角(0,0),bounds在调整的过程中,中心点是不能改变的,所以它从中心,往上下左右增加50。此时,其他的三个部分超出了界面我们是看不到的,只能看到它的右下角。 



二 、修改bounds的width值或height值  
细心的小伙伴可能发现当我们执行one.bounds = (CGRect){50,50,100,100};时候,虽然修改了origin的X、Y值,但是图像却没有任何变化,这是因为: bounds修改了origin值后,它影响的是它的字容器的位置

我们看下面的代码 
这里写图片描述 
注意:在这里,我们把UIView two添加到了one中,那么后者就是前者的父容器,所以two的位置就是参考one的左上角的 
这里写图片描述 
绿色小框之所以在红色框的右下角是因为two.bounds = (CGRect){50,50,50,50};它到红色框的左上角都是50

那么如果此时我们修改了one的bounds,one.bounds = (CGRect){-50,-50,100,100}; 
这里写图片描述 
这是因为bounds描绘的是在本地坐标系统中的位置和大小,one.bounds = (CGRect){0,0,100,100};表示在one这个UIView中,它本地的坐标原点是它的左上角,它的子容器在参考坐标的时候,都将左上角落定为(0,0) 
当我们执行one.bounds = (CGRect){-50,-50,100,100};时候,强制将自己坐标系的左上角点,改为(-50,-50)。那么此时的原点,自然就向在右下方偏移(50,50)。 
原点既然改变了,绿色小框也需要做出一定的调整

同样的,如果我们执行one.bounds = (CGRect){50,50,100,100};

此时,强制将自己坐标系的左上角点,改为(50,50),那么绿色小框刚好移动到这个区域。因为此时的原点是在左上方50那个点 
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值