简述

Frame: 视图的方位和巨细运用是父视图的坐标系,所以将视图放置在父级中这一点就很重要。 Bounds:视图的方位和巨细,运用的是其自己的坐标系,而对于这一点而言将视图的内容或子视图放置在其本身内很重要。

frame和bounds

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[superView addSubview:imageView];

[iOS开发]frame和bounds

Frame origin = (0, 0) width = 100 height = 100

Bounds origin = (0, 0) width = 100 height = 100

该图片中的FrameBounds彻底相同。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 50, 100, 100)];
[superView addSubview:imageView];

[iOS开发]frame和bounds

Frame origin = (10, 50) width = 100 height = 100

Bounds origin = (0, 0) width = 100 height = 100

改动Frame的 x、y 坐标会在父视图中移动它。可是视图本身看起来依然彻底相同。Bounds并没有不同。到目前为止,咱们看到的FrameBounds的宽度和高度一直是彻底相同的。然而这并不总是正确的。下面看看假如旋转视图片会产生什么。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 50, 100, 100)];
[superView addSubview:imageView];
imageView.transform = CGAffineTransformMakeRotation(M_PI * 0.05);

[iOS开发]frame和bounds

[iOS开发]frame和bounds
能够看到Bounds依然相同,可是Frame已经产生了更改。现在更简单看出framebounds之间的差异。
[iOS开发]frame和bounds
视图的框架被界说为该视图相对于其父坐标系的最小鸿沟框,包含应用于该视图的任何改换。在这里,能够看到鸿沟巨细和帧巨细彻底不同。这一点非常重要:视图的框架是相对于其父级坐标系的方位和巨细。视图的鸿沟是相对于其本身坐标系的方位和巨细。图中两个不同坐标系(黑色和蓝色的)能够帮咱们更好地理解。 文档里说:Note: When modifying the transform property of your view, all transformations are performed relative to the center point of the view.,修正transform视图的属性时,所有转化都是相对于视图的中心点履行的。也就是说,咱们进行transform后,再去修正视图方位最好运用center属性来修正。

到目前为止,Bounds原点是一直停留在 (0, 0)的,不过也纷歧定是这样的。假如咱们的视图有一个很大的子视图,它太大而无法一次显现呢?

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(150, 100, 120, 200)];
[self.view addSubview:view2];
view2.clipsToBounds = YES;
//    view2.bounds = CGRectMake(50, 0, 120, 200);
UIImageView *imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(-50, 50, 200, 200)];
[view2 addSubview:imageView2];
[imageView2 setImage:[UIImage imageNamed:@"pic.jpg"]];

[iOS开发]frame和bounds
相当于下图作用:
[iOS开发]frame和bounds
此时bounds的原点为(0, 0)。倘若咱们现在改动bounds的原点,会产生什么呢?

view2.bounds = CGRectMake(50, 0, 120, 200);

[iOS开发]frame和bounds
相当于:
[iOS开发]frame和bounds
从原坐标原点相对于大子视图的方位,再进行相对的移动。视图在父视图中没有移动,可是视图里面的内容产生了改变。这其实和咱们常用的UIScrollView系列控件的思维是相同的。大的子视图相当于画布,改动bounds更改的是显现画布的区域。

何时运用Frame,何时运用Bounds

因为frame相关视图在其父视图中的方位,因而您在进行向外更改时会运用它,例如更改其宽度或查找视图与其父视图顶部之间的间隔。

运用bounds时,你正在向内改变,就像画的东西或视图中组织子视图。假如您对它进行了一些转化,还能够运用bounds来获取视图的巨细。