view.bounds.origin是什么意思?

时间:2011-10-24 07:41:57

标签: iphone ios uiview

如果我将view.bounds.origin设置为(50,50),则绘制(50,50)子视图以便查看。但我认为它应该是反向结果,那么bounds.origin是什么意思?

抱歉,伙计们,我不是母语为英语的人,所以这次我把这个示例代码和图片放到了~~

subview = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
subview.backgroundColor = [UIColor blueColor];
subview.bounds = CGRectMake(50, 50, 200, 200);

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)];
subsubview.backgroundColor = [UIColor yellowColor];
[subview addSubView:subsubView];

这将导致此结果: enter image description here

为什么黄色视图位于那里?

5 个答案:

答案 0 :(得分:6)

来自documentation

  

在屏幕上,bounds矩形表示相同的可见   视图的一部分作为框架矩形。默认情况下,原点   bounds矩形设置为(0,0),但您可以将此值更改为   显示视图的不同部分。

您通过更改bounds所做的工作实际上是将subView的内部坐标空间向下和向右翻译50分。然后,您在subView的坐标空间内添加了原点为0,0的“subsubView” - 因此,这是subView的可见原点左侧50点。

如果您设置了subView的{​​{1}}而不是frame,那么您可能会在{em> superview的坐标空间内移动bounds,所以你的蓝色方块会向上移动到左边,黄色方块将包含在其中并具有相同的原点。

subView设置为不具有(0,0)原点的内容类似于向视图添加翻译。在几乎所有情况下,这不是您想要做的,您应该设置bounds属性。视图层次结构中的每个视图都有自己的坐标空间。 frame是视图与其超级视图相关的位置,frame是视图中的空间。

因此,子视图的bounds会在超级视图的frame中描述其位置和大小。如果超级视图的bounds具有非零原点,并且您添加了具有零原点的bounds的子视图,则它将超出超级视图的界限。

答案 1 :(得分:3)

问题是我们通常认为在更改blue view边界原点时(例如移到右下角),黄色视图也应该向右移动,因为yellow view位置相对于它的超视图坐标系(在这种情况下是blue view边界原点)。情况并非如此

相反,我们应该认为blue view定义了一个掩码,在该掩码中,它仅在其坐标空间中显示矩形的一部分。因此,如果我们将blue view边界原点更改为右下角,它只是将蒙版移动到右下角,并且仅显示该蒙版内的视图。对于red view,它始终显示固定位置(blue view帧原点的掩码不会改变)。考虑red view采用blue view掩码并放置blue view框定义的位置

Ole刚发现这个Understanding UIScrollView非常有帮助并且非常清楚地解释了

我强烈建议您阅读

  

视图在由其坐标定义的平面中提供视口   系统。视图的边界矩形描述了它的位置和大小   可见区域。

     

看起来好像已经下降了100点,这就是   实际上与其自身的坐标系有关。观点   屏幕上的实际位置(或在其超级视图中,更多   然而,准确地说,仍然是固定的,因为它是由它决定的   框架,没有改变

enter image description here

答案 2 :(得分:1)

你的蓝色视图的帧仍然是100,100,200,200。边界是50,50,200,200,但帧不变。

黄色视图将添加到边框内的0,0处的蓝色视图中,而不是帧中。所以黄色出现在50,50,50,50。

变化:

subview.bounds = CGRectMake(50, 50, 200, 200);

要:

subview.bounds = CGRectMake(100, 100, 200, 200);

看看会发生什么。

答案 3 :(得分:0)

  

在屏幕上,bounds矩形表示相同的可见   视图的一部分作为框架矩形。默认情况下,原点   bounds矩形设置为(0,0),但您可以将此值更改为   显示视图的不同部分。边界的大小   矩形耦合到框架矩形的大小,这样   改变为一个影响另一个。更改边界大小增长或   缩小相对于其中心点的视图。的坐标   边界矩形总是用点指定。

来自UIView's documentation

学习View Programming guide也会有所帮助。

答案 4 :(得分:0)

UIWindow:frame == bounds :: ==> (0,0,windowWidth,windowHeight)

子视图:frame :: ==> UIWindows边界上的(100,100,200,200)[UIWindows cordinate space。]

执行此操作时:

subview.bounds = CGRectMake(50, 50, 200, 200);

如果子视图的子视图[subsubview]要正确覆盖子视图,那么子视图的子视图框将以(50,50,200,200)开头。

正如您需要将子视图的帧指定为(0,0,windowWidth,windowHeight)以使用您的子视图正确覆盖窗口。

重点是,SUBVIEWS框架依赖于其直接的SUPERVIEWS坐标系统。直接超级视图的本地/内部坐标系统是它的界限。

指出为什么子视图上升并留下50 50点。

subview.bounds = CGRectMake(50, 50, 200, 200);

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)];

在(0,0)和(50,50)之间进行比较 我们说subview的本地/内部坐标空间是(50,50,200,200) 然后,我们在(0,0)视图子视图中添加了子视图的子视图[subsubview],从(50,50)开始。

在这种情况下,(0,0)在(50,50)的左上角。这就是为什么会这样。

如果你现在还没有得到它意味着什么,那么请仔细观察并慢慢地在笔记本中画出一些矩形。第一手掌握它是很棘手的。