view.bounds.origin的含义是什么?

说如果我把view.bounds.origin设置为(50,50),那么子视图被绘制(50,50)留下来查看。 但是我认为这应该是相反的结果,那么boundsorigin是什么意思?

对不起,我不是英语母语的人,所以我这次把这个示例代码和图像~~

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,0),但可以更改此值以显示视图的不同部分。

你通过改变bounds所做的事情是有效地将subView的内部坐标空间向下和向右平移50点。 然后你在子subView的坐标空间中添加了'subsubView',它的原点是0,0,因此这是50点,在子subView的可见原点的subView

如果你已经设置了子subViewframe而不是bounds ,那么你应该将subView 视图移到它的超视图的坐标空间中,这样你的蓝色方块就会向上移动到左边,黄色方块就会被包含在其中,并且具有相同的原点。

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

所以,一个子视图的frame在超视图的bounds描述了它的位置和大小。 如果超级视图的bounds有一个非零原点,并且添加了一个具有零原点的frame的子视图,它将会在超视图边界之外。

问题是我们通常认为,当改变blue view边界原点(例如移到右下angular)时,黄色视图也应该右移底部,因为yellow view位置相对于其超视图坐标系(在这种情况下, blue view范围的起源)。 不是这种情况

相反,我们应该认为blue view定义了一个掩模,它只在其坐标空间中显示矩形的一部分。 所以,如果我们将blue view边界原点改变到右下方,它只是将面具移到右下方,并且只显示该面具内的视图。 而对于red view ,它总是显示在一个固定的位置( blue view帧原点不变)的面具。 考虑把blue view遮罩放在由blue view框架定义的位置上的blue view

刚刚发现这个由Ole 理解UIScrollView是非常有用的,并解释得非常清楚

我强烈build议阅读这个

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

看起来好像这个观点已经下降了100个点,事实上这个观点对于它自己的坐标系是正确的。 视图在屏幕上的实际位置(或者在其超视图中,更准确地说)保持不变,然而,由它的框架决定,它没有改变

在这里输入图像说明

你的蓝色视图的帧仍然是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,0),但可以更改此值以显示视图的不同部分。 边界矩形的大小与框架矩形的大小相关联,以便更改一个会影响另一个。 相对于其中心点,更改边界大小会增大或缩小视图。 边界矩形的坐标始终以点指定。

从UIView的文档 。

学习视图编程指南也将是有帮助的。

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

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

当你这样做:

 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)。
我们说子视图的局部/内部坐标空间为(50,50,200,200)然后,我们在(50,50)开始的视图子视图内的(0,0)处添加子视图的子视图[subsubview]。

在这种情况下,(0,0)是(50,50)的左上angular。 这就是为什么发生这种情况

如果你现在还不明白这个意思,那就慢慢来,在笔记本上画一些矩形。 它是第一手的,它很棘手。