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
。
如果你已经设置了子subView
的frame
而不是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。 这就是为什么发生这种情况
如果你现在还不明白这个意思,那就慢慢来,在笔记本上画一些矩形。 它是第一手的,它很棘手。