frame与bounds的关系

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}
frame与bounds的关系_第1张图片
创建三个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}
frame与bounds的关系_第2张图片
修改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}
frame与bounds的关系_第3张图片
修改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}

frame与bounds的关系_第4张图片
修改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}}
frame与bounds的关系_第5张图片
旋转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的关系)