iOS frame 和 bounds

相关和无关的属性

bounds 和 frame
视图的 frame 和 bounds 的size通常是一样的(虽然可以被 transforms 改变),但是他们的 origin 经常是不同的
光栅化步骤中,视图并不关心自己的 frame (用来放置视图的图像)或自己在视图层级中的位置(这是决定组合的顺序)。只关心一件事就是绘制它自己的 content。这个绘制发生在每个视图的 drawRect:方法中。
drawRect: 方法被调用前,会为视图创建一个空白的图片来绘制 content。这个图片的坐标系统是视图的 bounds。几乎每个视图 bounds 的 origin 都是 {0,0}。因此,当在光栅化图片左上角绘制一些东西的时候,你都会在 bounds 的 origin {x:0, y:0} 处绘制。在一个图片右下角的地方绘制东西的时候,你都会绘制在 {x:width, y:height} 处。如果你的绘制超出了视图的 bounds,那么超出的部分就不属于光栅化图片的部分了,会被丢弃。

image.png

在组合的步骤中,每个视图将自己光栅化图片组合到自己父视图的光栅化图片上面。视图的 frame 决定了自己在父视图中绘制的位置,frame 的 origin 表明了视图光栅化图片左上角相对父视图光栅化图片左上角的偏移量。所以,一个 origin 为 {x:20, y:15} 的 frame 所绘制的图片左边距其父视图 20 点,上边距父视图 15 点。因为视图的 frame 和 bounds 矩形的大小总是一样的,所以光栅化图片组合的时候是像素对齐的。这确保了光栅化图片不会被拉伸或缩小。


image.png

减少 Superview.bounds.origin 的值,用和前一个图例相同的 frames,但改变了紫色视图 bounds 的 origin 为 {-30, -30}。得到下图:


image.png
CompositedPosition.x = View.frame.origin.x - Superview.bounds.origin.x;
CompositedPosition.y = View.frame.origin.y - Superview.bounds.origin.y;

scrollView

通过改变这个紫色视图的 bounds,它的子视图都被移动了。这正是 scroll view 工作的原理。当你设置它的 contentOffset 属性时它改变 scroll view.bounds 的 origin。事实上,contentOffset 甚至不是实际存在的。代码看起来像这样:

- (void)setContentOffset:(CGPoint)offset
{
    CGRect bounds = [self bounds];
    bounds.origin = offset;
    [self setBounds:bounds];
}

检查 viewForZoomingInScrollView:方法返回视图的 transform属性。会发现 scroll view 只是聪明的利用了 UIView 已经存在的属性。

你可能感兴趣的:(iOS frame 和 bounds)