完结之frame和bounds的区别

本文探讨了iOS开发中frame和bounds的区别,强调frame定义视图在父视图坐标系的位置和大小,而bounds则在自身坐标系决定大小,其改变会影响子视图位置。center属性用于确定视图中心点,改变bounds会影响视图大小,改变center会影响视图位置。通过实例代码展示了frame、bounds和center之间的相互影响。

        回顾上集,我写了frame和bounds在x、y上的区别,以及简单的描述frame的width和height。这次,继续前集但又不同于前集。继续前集,我是想把bounds的width和height讲完。不同的是,我继续学习的时候看到一篇不同我之前看过的对frame和bounds介绍的文章,这也刷新了我的知识点。这些都是废话,接下来正式开始......

        我看过一篇文章是这样写的,“frame、bounds和center三个属性是相互关联、相互影响的,其中一个属性发生变化,其他属性也会跟着变化。对于视图或者图层来说,frame并不是一个非常清晰的属性,它其实是一个虚拟属性,是根据bounds,position和transform计算而来,所以当其中任何一个值发生改变,frame都会变化。相反,改变frame的值同样会影响到他们当中的值。

看到这段文字的时候,算了,还是实操吧!

        let myView = UIView()
        myView.backgroundColor = .blue
        //描述当前界面元素在其父界面元素中的位置和大小。
        myView.frame = CGRect(x: 50, y: 100, width: 300, height: 300)
        //描述当前界面元素在其自身坐标系统中的位置和大小。
        myView.bounds = CGRect(x: 0, y: 0, width: 200, height: 200)
        //描述当前界面元素的中心点在其父界面元素中的位置
        myView.center = CGPoint(x: kWidth / 2  , y: kHeight / 2)
        self.view.addSubview(myView)
        
        let x = myView.frame.origin.x
        let y = myView.frame.origin.y
        let width = myView.frame.width
        let height = myView.frame.height
        print("x =",x, "y =",y, "width = ",width, "height = ", height)
        
        let myView2 = UIView()
        myView2.backgroundColor = .yellow
        myView2.frame = CGRect(x: 50, y: 50, width: 100, height: 100)
        myView2.bounds = CGRect(x: 0, y: 0, width: 50, height: 100)
        myView2.center = CGPoint(x: 100, y: 100)
        myView.addSubview(myView2)
        
        let x2 = myView2.frame.origin.x
        let y2 = myView2.frame.origin.y
        let width2 = myView2.frame.width
        let height2 = myView2.frame.height
        print("x2 =", x2 , "y2 =", y2, "width2 =", width2, "height2 =", height2)

运行结果:

        结合代码和运行结果可以看出,在设置了bounds和center之后,view的位置和大小和frame中设置的不一样了。bounds改变了view的大小,center改变了view的位置。

接下来,说说frame、bounds和center的联系吧!顺便把之前的bounds讲完。一起实操吧!

  • 注释掉center,先讲frame和bounds

但是这结果和我预想不太一样,在我将bounds的大小设置和frame中的一样后,结果就和我想的一样了,结果如下:

这样的话,正好就涉及到了bounds修改大小时是怎么改变大小的。之前对于这点不知道怎么解释(其实是自己也不怎么明白),知道看到有篇文章是这么写的, “bounds默认的边界原点是(0,0),大小与frame属性中矩形的大小相同。改变这个矩形的大小部分会使视图相对于它的中心点增长或收缩。改变大小也会改变frame属性中矩形的大小以匹配。边界矩形的坐标总是以点来指定。

先实操证明一下,bounds的大小改变是根据中心点增大和缩小的

代码与上面一致,仅修改数据如下:

这里实操对比是将frame和bounds的width和height设置一致和增加或减少做对比

一致时:

 myView减少、myView2增加后:

运行的结果:

 预想中改变的样子如图:

 对比运行结果,很明显发现,myView是符合的,但是myView2是不符合运行结果的。为什么呢?我也是画了图对比之后才发现的,我也很崩溃,算了,从运行结果中找原因吧!不放弃,不抛弃。

我悟了!!!原来是忘了设置bounds时,当前视图的子视图的位置也会跟着变化的,所以我预想的结果应该是这样的。

 而且前面那张图错误还是挺多的.......我自己可长点心吧!!!🤬🤬🤬🙏

来个总结,养成好习惯。

总结:frame和bounds的区别:frame是在父视图坐标系统中确定位置和大小的。bounds是在自身坐标系统中确定大小的,是以视图中心点来增大或缩小。bounds的x、y是修改当前视图的坐标系统,对自身的位置不产生影响,但是会造成当前视图的所有子视图的位置产生偏移。center是以点表示的,以视图的中心点确认视图的位置,所以,当设置了center之后,frame的x、y的原本设置可以被忽略,因为frame的x、y会随着center的确定而发生改变。center只能确定位置而不能设置大小。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值