美文网首页
frame与bounds的关系

frame与bounds的关系

作者: oneday527 | 来源:发表于2018-03-19 20:20 被阅读0次

    frame与bounds是我们UI开发中最常用到的,只知道frame使用父类坐标系bounds使用本身坐标系,理解的并不够深入,本文通过几个小栗子来总结一下frame与bounds的关系,以及修改之后有哪些变化。

    - (void)viewDidLoad {
           [super viewDidLoad];
        UIView * superView = [[UIView alloc] initWithFrame:CGRectMake(30, 70, 350, 350)];
        superView.backgroundColor = [UIColor lightGrayColor];
    //    superView.bounds = CGRectMake(0, 0, 350, 350);
        NSLog(@"center:%@",NSStringFromCGPoint(superView.center));
        [self.view addSubview:[self showLableForView:superView]];
        [self.view addSubview:superView];
        
        UIView * view1 = [[UIView alloc] initWithFrame:CGRectMake(10, 70, 100, 100)];
        view1.backgroundColor = [UIColor redColor];
        [superView addSubview:[self showLableForView:view1]];
        [superView addSubview:view1];
        
        UIView * view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 230, 100, 100)];
        view2.backgroundColor = [UIColor yellowColor];
        [superView addSubview:[self showLableForView:view2]];
        [superView addSubview:view2];
        
    }
    
    2018-03-19 00:09:39.813150+0800 Frame&Bounds[20817:2256742] center:{205, 245}
    
    创建三个view
    1、修改superView的bounds,只改origin不改size
        superView.bounds = CGRectMake(35, 10, 350, 350);
    
    2018-03-19 18:18:28.535299+0800 Frame&Bounds[78184:2186954] center:{205, 245}
    
    修改superView的bounds,只改origin不改size

    结果:superView的bounds变化,子类frame与bounds无变化。
    结论:bounds的origin标注本地坐标系统的原点。
    superview的center无变化

    2、修改superView的bounds,只改size不改origin
        superView.bounds = CGRectMake(0, 0, 200, 200);
    
    2018-03-19 18:18:56.586907+0800 Frame&Bounds[78220:2188217] center:{205, 245}
    
    修改superView的bounds,只改size不改origin

    结果:superView的frame与bounds变化,其center不变superView以center为中心缩放,子类frame与bounds无变化。
    结论:修改bounds的size影响frame的size。superview的center未变。

    3、修改superView的frame
        superView.frame = CGRectMake(0, 100, 200, 350);
    
    2018-03-19 00:12:44.073041+0800 Frame&Bounds[21206:2268036] center:{100, 275}
    
    修改superView的frame
    结果:superView的frame与bounds变化,子类frame与bounds无变化。
    结论:修改frame会影响bounds的size但是不会影响origin。
    superview的center改变!
    4、旋转superView
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        view.center = self.view.center;
        view.backgroundColor = [UIColor redColor];
        [self.view addSubview:view];
        
        NSLog(@"view.frame = %@",NSStringFromCGRect(view.frame));
        NSLog(@"view.bounds = %@\n",NSStringFromCGRect(view.bounds));
        view.transform = CGAffineTransformMakeRotation(M_PI_4);
        NSLog(@"view.frame = %@",NSStringFromCGRect(view.frame));
        NSLog(@"view.bounds = %@\n",NSStringFromCGRect(view.bounds));
    }
    
    2018-03-19 17:39:14.114521+0800 Frame&Bounds[76157:2132120] 旋转前view.frame = {{137.5, 283.5}, {100, 100}}
    2018-03-19 17:39:14.114631+0800 Frame&Bounds[76157:2132120] 旋转前view.bounds = {{0, 0}, {100, 100}}
    
    2018-03-19 17:39:14.114724+0800 Frame&Bounds[76157:2132120] 旋转后view.frame = {{116.78932188134526, 262.78932188134524}, {141.42135623730951, 141.42135623730951}}
    2018-03-19 17:39:14.114817+0800 Frame&Bounds[76157:2132120] 旋转后view.bounds = {{0, 0}, {100, 100}}
    
    旋转superView

    view的frame变化,bounds无变化。仔细观察旋转后的frame ,origin的位置如图所示。并且frame的size不等于bounds的size。
    结论:frame是view所占的位置的边框(外切红色矩形的矩形),bounds是view的边界。

    总结如下:
    1、frame采用父类的坐标系统。
    2、bounds使用本身坐标系统,默认以原点为起点坐标。
    3、修改frame的origin不会影响bounds,只表示改变本身位于父类坐标系统的位置。
    4、修改bounds的origin,即修改本地坐标系统的原点,会影响子view的显示位置。
    5、frame与bounds的size不一定相等(旋转情况)。
    6、修改bounds的size,是以center为中心缩放。
    7、修改frame的size,是以原点为中心缩放。

    相关文章

      网友评论

          本文标题:frame与bounds的关系

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