美文网首页iOS技术收藏程序设计IOS | MAC
你真的明白frame和bounds了吗

你真的明白frame和bounds了吗

作者: 夜_阑珊 | 来源:发表于2016-08-23 11:16 被阅读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,进而影响到再父视图的显示位置和大小。
    

    相关文章

      网友评论

      本文标题:你真的明白frame和bounds了吗

      本文链接:https://www.haomeiwen.com/subject/mwkisttx.html