view的frame和bound两个属性

view的frame和bound两个属性


view的frame和bound两个属性,frame还好理解,用起来也方便。bounds却有些绕弯,怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bound的含义。

frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)

bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)

center:该view的中心点在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)

每个view都有一个本地坐标系统(自己的坐标系统)。这个坐标系统作用比较重要,比如触 摸的回调函数中的UITouch里面的>坐标值都是参照这个本地坐标系统的坐标。

当然bounds这个属性也是参照这个本地坐标系统来的。

其实本地 坐标系统的关键就是要知道的它的原点(0,0)在什么位置(这个位置又是相对于上层的view的本地坐标系统而言的,当然最上面的一层view就是 window它的本地坐标系统原点就是屏幕的左上角了)。

通过修改view的bounds属性可以修改本地坐标系统的原点位置。


frame:影响的是自己加到在父视图上面的位置。比较容易理解。

例如:

扫描二维码关注公众号,回复: 1567274 查看本文章

UIView v1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];

[self.view addSubview:v1];v1加到self.view视图上 的起点在self.view的(100,100)坐标点的位置。

UIView v2 = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100)];

[v1 addSubview:v2];v2加到v1视图上面,v2的起点是v2的(10,10)坐标点。


bounds:影响的是加到自己上面的子视图的位置,以及自己坐标(0,0)零点的位置。

bounds,到底是怎样影响的呢?

例如:设置v2的bounds值为:

v2.bounds = CGRectMake(20, 20, 50, 50);意思是把view2视图原点的(x,y)设置为坐标值(20,20),那么view2的自身的坐标零点(0,0)点就在视图原点(20,20)向左向上各自20的位置,也就是说此时v2的零点在视图外。

如果再有

UIView * v3 = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 50, 50)];

[v2 addSubview:v3];那么view3的Frame的起点是从v2视图外面的的零点坐标(0,0)点算起的。


另外:

UIView * v3 = [[UIView alloc]init];

v3.backgroundColor = [UIColor orangeColor];

v3.bounds = CGRectMake(10, 10, 100,100);

[v2 addSubview:v3];

这种没有给出frame值初始化视图的方式是有缺陷的。即使随后给定了bounds值。

但是由于v3不知道应该放在v2的哪个位置开始。

系统会把v3的中心center坐标放在v2的原点(0,0)。至于为什么 会是这样设计,可能是Xcode默认设置的,为了不让创建视图出现找不到原点位置。

如果v3再次指定了frame,就不会这样了。

猜你喜欢

转载自blog.csdn.net/quyunde/article/details/51307228