如果我将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];
这将导致此结果:
为什么黄色视图位于那里?
答案 0 :(得分:6)
在屏幕上,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点,这就是 实际上与其自身的坐标系有关。观点 屏幕上的实际位置(或在其超级视图中,更多 然而,准确地说,仍然是固定的,因为它是由它决定的 框架,没有改变
答案 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),但您可以将此值更改为 显示视图的不同部分。边界的大小 矩形耦合到框架矩形的大小,这样 改变为一个影响另一个。更改边界大小增长或 缩小相对于其中心点的视图。的坐标 边界矩形总是用点指定。
学习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)的左上角。这就是为什么会这样。
如果你现在还没有得到它意味着什么,那么请仔细观察并慢慢地在笔记本中画出一些矩形。第一手掌握它是很棘手的。