iOS技术收藏程序设计IOS | MAC

你真的明白frame和bounds了吗

2016-08-23  本文已影响730人  夜_阑珊

前言

也许你做ios开发已经有些年了,也许你才刚刚开始加入ios开发大军,大神也好,小白也好,而下面两行代码,也许是我们敲的最想吐的几行代码之一:

 self.XXView.frame = CGRectMake(0, 0, 100, 100);
 self.XXView.bounds = CGRectMake(0, 0, 100, 100);

一个设置坐标,一个设置边框,这两行我们重复了无数遍的代码,你果真搞清楚了他们之间的区别吗?(已懂的大神请自行return)

我们都知道

frame:决定一个视图在它父视图上的显示区域和大小,以父视图左上角为原点(0,0)
bounds:以自己左上角为原点(0,0),并可以设置自身尺寸大小。

好像我们了解的就仅止于此了

我们现有的开发在使用bounds好像总有一条神秘的命令指挥着我们:CGRect的(x、y)一定要为(0,0),否则便会有不好的事情的发生

//我们一直都在这么做,却不知道为什么
self.XXView.bounds = CGRectMake(0, 0, 100, 100);

事实上,你如果不设为(0,0),确实有不好的事情发生。我们用如下代码验证:

   //创建红色view
    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    //设置bounds,x,y分别为20,20,宽高不变
    redView.bounds = CGRectMake(20, 20, 200, 200);
    redView.backgroundColor = [UIColor redColor];
    //把红色view添加到控制器view上
    [self.view addSubview:redView];
    
    //创建紫色view
    UIView *purpleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    purpleView.backgroundColor = [UIColor purpleColor];
    //把紫色view添加到红色view上
    [redView addSubview:purpleView];

运行页面结果如下:

imgae1.png

我们会看到:紫色view的frame(x,y)虽然设为(0,0),但它的左上角却不在父视图左上角,而是偏离出父视图外面去了

为什么,我们只是改变了bounds的x、y而已

好吧,是时候再给bounds做一层注释了:

bounds决定了本地坐标系统的位置和大小

这句话怎么理解呢?
1、我们知道,坐标系最重要的是确定原点(0,0),以哪里为原点才能知道一个view的左上角从哪里开始摆放。
2、view本地坐标系就是它自身的坐标系,这个坐标系是相对于它的子视图而言,即本地坐标系作用于子视图。bounds的x,y决定本地坐标系的坐标原点,系统默认为(0,0)。
3、上面红色view的bounds(x,y)设为了(20,20),也就是它的坐标原点变成了(20,20)。
4、通俗一点的理解,子视图若要处于红色view左上角原点位置,那么它frame的(x,y)要为(20,20)。但是紫色view的(x,y)被设为了(0,0),所以我们要找到坐标系(0,0)位置。即在原点处,向左移动20,向上移动20,就是(0,0)位置。比较绕,请参照下图理解:

image2.png

上面只是改变了bounds的x和y,若width和height也改呢

我们用代码作如下验证:

  //创建红色view
    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    //打印此时的frame
    NSLog(@"log1:%@",NSStringFromCGRect(redView.frame));
    //设置bounds,x,y分别为20,20,宽高为300,300
    redView.bounds = CGRectMake(20, 20, 300, 300);
    //打印设置完bounds后的frame
     NSLog(@"log2:%@",NSStringFromCGRect(redView.frame));
    redView.backgroundColor = [UIColor redColor];
    //把红色view添加到控制器view上
    [self.view addSubview:redView];

打印结果:

2016-08-23 10:52:30.926 frame和bounds区别[1038:38905] log1:{{50, 100}, {200, 200}}
2016-08-23 10:52:30.927 frame和bounds区别[1038:38905] log2:{{0, 50}, {300, 300}}

我们会发现:review的frame不仅width、height变了,x,y也变了,从之前的(50,100),变成了(0,50),x、y都减少了50。

由此我们知道,改变bounds的width和height,不仅会影响frame的width和height(两者的width和height保持一致),还会影响frame的x,y。这种影响是随着bounds的width和height增加或减少,平均扩充或缩减四周的区域。

用上面的例子解释,bounds宽高都增加了100,所以会向四周平均扩充区域,在原来的基础上,往上、往下、往左、往右各扩充50,所以x、y都会减少50。

总结

bounds的有以下两个特点:

1. 它可以修改自己坐标系的原点位置,影响“子view”的显示位置。

2. bounds,它可以通过改变宽高,改变自身的frame,进而影响到再父视图的显示位置和大小。
上一篇下一篇

猜你喜欢

热点阅读