「OC」frame和bounds的区别

「OC」frame和bounds的区别

前言

在我们平时在使用OC编程的时候,最近常使用frame和bounds来布局控件的位置和大小,但是学了这么久还不太懂这两者的区别,于是我就进行了以下学习在UIView之中frame和bounds之间的具体区别。

frame

当我们布局每一个控件的时候,多数都需要使用来frame来布局其相关的位置,frame是根据当前视图的父视图的左上角为锚点进行参照,如下图所示

img

我们可以写一个程序进行探究

UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
    [viewA setBackgroundColor:[UIColor blueColor]];
    [self.view addSubview:viewA];
    NSLog(@"viewA - %@",NSStringFromCGRect(viewA.frame));

    UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    [viewB setBackgroundColor:[UIColor yellowColor]];
    [viewA addSubview:viewB];
    NSLog(@"viewB - %@",NSStringFromCGRect(viewB.frame));

    UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [viewC setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:viewC];
    NSLog(@"viewC - %@",NSStringFromCGRect(viewC.frame));

image-20240910213758793

这个程序在我们看来视图B和C的起点是相同的,但实际上B的起点为(50,50),C的起点为(100,100)

bounds

image-20240911190941967

如果我们将打印出来的内容改为bounds呢,那么我们就会发现。bounds的起点永远为(0,0),由此我们可以知道bounds表示的默认位置位置为当前视图的左上角的位置。

修改bounds位置

我们尝试着更改一个viewC之中bounds的位置,会发现视图在屏幕之中的位置根本没有发生改变,但是如果改变viewA的bounds为

viewA.bounds = CGRectMake(50, 50, 300, 300);

则会出现以下情况

image-20240911191931577

这是为什么呢?借用大佬博客之中的图片,能够很好的诠释这个问题

修改前:

img

修改后:

img

可以看到我们修改了viewA的bounds的位置,viewB的位置发生改变,是因为viewB不再将viewA的左上角当作坐标系,而是viewA的左上角坐标变为了(0,100)

总结一下可以得修改bounds的位置实质上就是修改了子视图在frame之中参考父视图的坐标原点的位置

修改bounds大小

我们设想一下,如果修改的是frame之中的大小,那么就是控制了视图的大小,但是视图左上角的坐标位置并不会发生改变,那么bounds又是不是同理呢?

我们做一个实验就知,仍然是上面的代码,我们将viewB的frame和bounds分别做一下改变

修改frame大小

viewB.frame = CGRectMake(viewB.frame.origin.x, viewB.frame.origin.y, 100, 100);

和我们刚刚说的一样,viewB以左上角为基准,上边和左边的长度缩短了100,和viewC重叠在了一起

image-20240911194045621

修改bounds大小

这里我们使用set的方法来重新设置bounds属性

[viewB setBounds:CGRectMake(viewB.bounds.origin.x, viewB.bounds.origin.y, 100, 100)];

如果bounds的作用效果于frame相同的情况下,那么打印出来的frame以及viewB和viewC的位置情况应该与上相同。

image-20240911194537943

可是从结果上来看,viewB并没有和viewC重合,反倒是viewB的frame也发生了改变,而且位置相对于viewA是居中的,那么我们可以合理猜测,bounds大小的修改是会使得view不变中心点,长宽根据中心点来进行相对应的缩放。

那我们将viewB的center修改一下,按照我们的猜想修改至viewC的中心即可让viewC遮挡住B,注意center的位置也是相对于父视图的,所以我们做出以下修改

viewB.center = CGPointMake(100, 100);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

区别总结

frame

frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置。

frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变。

bounds

bounds改变位置时,改变的是子视图的坐标系位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角。

bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就像缩放一样。

参考文章

frame与bounds的区别详解

iOS开发之如何保证控件位置不变,增加触控范围(即frame和bounds的区别)

frame和bounds的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值