什么时候UIView的bounds.origin不是(0, 0)?

问题描述 投票:0回答:4

UIView 的

bounds.origin
什么时候不是
(0, 0)

这一段对我很有帮助:

重要!!边界 X 和 Y(原点)用于在范围内移动 看法。例如 X+5,向帧原点左侧移动 5pix 意思是将此视图中的所有内容绘制到框架左侧 5pix 起源。它对自己没有任何作用,它是被画在它上面的东西 受到影响。

但它只描述了我自己设置

bounds.origin
值的情况。
在其他什么情况下
bounds.origin != (0, 0)
的值?

ios objective-c uiview bounds
4个回答
42
投票

视图的框架决定了它的在超级视图中的位置。视图的边界决定了它的子视图位置。这意味着,如果更改视图的边界,其位置不会更改,但其所有子视图的位置都会更改。

正值宽度和高度就像从左上到右下绘制视图,而负值是从右下到左上绘制视图。所以

frame1 = CGRectMake(100, 100, -50, -50) 

完全相同
frame2 = CGRectMake(50, 50, 50, 50). 

事实上,如果您使用第 1 帧初始化视图,它将“自动更改”到第 2 帧。 但是

bounds.origin

的观点并不相同。

Bounds.origin
表示您“绘制”视图的点,因此所有子视图帧都将从该点开始。

例如,在横向 iPhone 6 中,我们有:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)]; leftView.backgroundColor = [UIColor greenColor]; [self.view addSubview:leftView]; UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)]; rightView.backgroundColor = [UIColor blueColor]; [self.view addSubview:rightView];

我们得到:

我们会发现rightView的frame自动变为正值,即(342, 50, 275, 275),但是它

bounts.origin = (-275,-275)


我们添加子视图:

UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; leftSubview.backgroundColor = [UIColor grayColor]; [leftView addSubview:leftSubview]; UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; rightSubview.backgroundColor = [UIColor grayColor]; [rightView addSubview:rightSubview];

因此,边界使得 rightView 的子视图遵循我们初始化 rightView 的原点。

如果我们将 rightView 的边界更改为 leftView: rightView.bounds = leftView.bounds; 那么两个子View的位置是相同的,我们丢失了rightView的宽度和高度为负数的信息。

我们更改 leftView 的边界而不是 rightView: CGRect 边界 = leftView.bounds; 边界.origin = CGPointMake(50, 50); leftView.bounds = 边界;

我们可以看到,它的子视图的frame.origin偏移了bounds.origin(使用减号,而不是加号)。

结论:

  1. view.bounds

    决定其所有子视图的位置(由bounds.origin偏移),而

    bounds
    不会影响其自身在其父视图中的位置。
    
    

  2. 如果你初始化一个负宽高的视图,它会自动变为正数(不会改变位置),但它的bounds.origin表示你开始“绘制”视图的点。

31
投票

当您布局滚动视图的子视图时,这个概念非常重要。例如,如果将滚动视图的子视图放置在 (0, 0) 处,则子视图通常会与滚动视图的其他内容一起移动。但是,如果您像下面的代码一样在滚动时不断将子视图的中心更新为边界的原点,则无论您如何滚动,子视图的位置都将固定在滚动视图的左上角。

func scrollViewDidScroll(_ scrollView: UIScrollView) { subview.center = scrollView.bounds.origin }



17
投票

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)];

框架将是:

origin = { x = -5, y = -15 }, size = { width = 10, height = 20 }

界限:

origin = { x = -10, y = -20 }, size = { width = 10, height = 20 }

中心:

x = 0, y = -5

亲自尝试一下!


0
投票

在大多数情况下,这不会发生。如果您使用负宽度和/或高度初始化视图,您将得到宽度为负 X 和/或高度为负 Y 的原点。

© www.soinside.com 2019 - 2024. All rights reserved.