2011-10-24 80 views
6

说如果我将view.bounds.origin设置为(50,50),那么子视图被绘制(50,50)留下来查看。但我认为它应该是相反的结果,那么boundsorigin是什么意思?view.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

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

+0

你是什么意思的“相反的结果”? – Geoffroy

+0

你能澄清,可能与一些示例代码,你在哪些视图设置bounds.origin并且何时添加子视图,以及子视图的框架是什么? – jrturton

+0

你已经设置了bounds.origin? –

回答

4

documentation

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

你通过改变bounds做什么是有效地转化subView的内部坐标空间50点向下和向右。然后,您在subView的坐标空间中添加了'subsubView',其原点为0,0,因此这是50点,并在subView的可见原点左侧。

如果设置了subView的的frame代替bounds,你会感动subView内是上海华盈的坐标空间,让您的蓝色方块会向上移动,向左,和黄方将被包含在它和起源相同。

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

因此,子视图frame在超级视图的bounds中描述了它的位置和大小。如果超级视图的bounds有一个非零来源,并且您添加了一个frame的零点来源的子视图,它将在超级视图的界限之外。

+0

“因此,这是50分和子视图的可见来源的左侧”为什么是这样,你能解释一点点? – onmyway133

+0

@entropy - 编辑。希望有所帮助。 – jrturton

+0

1.“如果你设置了子视图的框架而不是边界,那么你应该在其超级视图的坐标空间内移动子视图,这样你的蓝色方块就会向上移动,并向左移动”我认为你错误地输入了这里,改变了子视图的框架(subView。 frame.origin.x + = 50,subView.frame.origin.y + = 50)应该移到右下角。此外,我无法想象它的起源发生变化时界限的样子 – onmyway133

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);

,看看会发生什么。

+0

当界限的起源发生变化时,界限是什么样的?我无法想象这一点 – onmyway133

0

在屏幕上,边界矩形表示与其框架矩形相同的可视部分视图 。默认情况下,边界矩形的起点 设置为(0,0),但可以将此值更改为 显示视图的不同部分。边界的大小 矩形与框架矩形的大小相结合,以便 更改为一个会影响另一个。更改边界大小或者收缩相对于其中心点的视图。边界矩形的坐标始终以点表示。

UIView's documentation

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

2

问题是,我们通常认为,当改变所述blue view界原点(例如右移底部),则黄色视图应该移位右底部也一样,yellow view位置是相对于它的父坐标系(在本案例blue view界限起源)。情况并非如此

相反,我们应该认为blue view定义了一个掩模,它只在其坐标空间中显示矩形的一部分。因此,如果我们将blue view界限原点更改为右下角,则只会将遮罩移至右下角,并且只会显示该遮罩内的视图。而且对于red view,它始终显示掩码处于固定位置(blue view帧起源不会改变)。在red view的认为服用blue view面具,在由blue view框架

由OLE刚刚发现这个Understanding UIScrollView这是非常有帮助的规定位置放置,并解释得很清楚

我强烈建议阅读本

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

看起来好像视图已经向下移动了100个点,而实际上这是 与其自己的坐标系有关。屏幕上的view's 实际位置(或在它的父,说得更 准确)保持固定,但是,作为通过其 帧,其没有改变确定

enter image description here

0

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

subview:frame :: ==>(100,100,200,200)在UIWindows边界[UIWindows坐标空间。]

当你ü做到这一点:

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

您是说子视图的子视图框架将开始与(50,50,200,200),如果该子视图的子视图[subsubview]是正确覆盖子视图。就像你需要指定你的子视图的框架(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)之间进行比较。
我们说子视图的本地/内部坐标空间为(50,50,200,200) 然后我们在视图子视图内的(0,0)处添加了子视图的子视图[subsubview],该视图开始于(50,50 )。

在这种情况下,(0,0)是(50,50)的左上角。这就是发生这种事的原因。

如果你现在还没有明白它的意思,那么请深入了解并慢慢地在笔记本上画出一些矩形。它很难让第一手准确。