学习ios也有一段时间,但是对于视图的frame和bounds还是有一些模糊。所以正好在这里整理一下,便于学习和理解。
首先是两段代码看看frame和bounds的一些区别:
frame{return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);}
bounds{return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);}
上面可以看出,bounds的原点是(0,0)点,而frame的原点是任意的,framede原点坐标是相对于父视图的原点坐标。
这儿有一张很经典的关于区分它两关系的图片:
frame:该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)比如:上图的View B的frame,它的原点坐标是相对于父视图的,大小为(200,100)
bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
简单的做一下总结就是:
对于frame来说,frame的(frame.origin.x,frame.origin.y)就是相对于父坐标系的偏移量,记住这个犀利的词“相对”,并且参照物是“父视图”
对于bounds来说,你可以认为每个view都有一个本地坐标系统,这个坐标系统作用比较重要,坐标值都是参照这个本地坐标系统的坐标,当然bounds这个属性也是参照这个本地坐标系统来的。bounds有这么一个特点:它是参考自己坐标系,它可以修改自己坐标系的原点位置,进而影响到“子view”的显示位置。
下面是一个小的Demo:
上述代码的结果是:
把注释去掉后的效果是:
很显然了,改变View1的bounds之后,View1的bounds的坐标已经为(-20,-20),所以其子视图View2的frame的原点坐标如果为(0,0),则需要找到它的父视图的frame的起始位置也就是父视图的(0,0)位置,在VIew1当前的这个坐标系下(也就是根据bounds所设的当前View1它本身的坐标系),要找到view1的(0,0)位置很显然需要给它的x和y都加上20,因此view1的(0,0)位置在View2的左上角位置上,而View1自身的起始位置已经是(-20,-20)
让我们再来理一下思维,根据上面的数据,View1的frame的起始位置为(20,20),它的bounds的起始位置为(-20,-20),View2的frame位置为(0,0),但是这里有一个坑那就是,View2的frame是相对于它的父视图View1的,所以它的位置需要参照View1的(0,0)位置,最后呈现的结果就是上面图示所出现的结果。虽然View2的frame的起始点为(0,0),但是这个点是需要参考父视图的坐标系的。
总之,记住一句话,bounds表示的视图本身的坐标系,frame表示视图相对于父视图的坐标系。