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

时间:2011-12-09 22:54:35

标签: ios objective-c uiview bounds

UIView的bounds.origin何时不是(0, 0)

This post对我有帮助:

  

注意!!界限X和Y,原点,是在内部移动   视图。对于示例X + 5,将5pix移动到帧原点的左侧   意思是将此视图中的所有内容绘制到框架的左侧5pix   起源。它对自己没有任何作用,它正是它所吸引的   受到影响。

但它仅描述了我自己设置bounds.origin值的情况 在其他情况下bounds.origin != (0, 0)的价值?

4 个答案:

答案 0 :(得分:28)

查看框架确定其在超级视图中的位置。查看范围确定其子视图位置。这意味着,如果您更改了视图的边界,其位置将无法更改,但其所有子视图位置都将更改。

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

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

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

事实上,如果你使用frame1初始化一个视图,它将自动改变到第2帧。

但是bounds.origin的观点并不相同。 Bounds.origin表示您要绘制"视图,因此所有子视图帧都将在此时生成。

例如,在Landscape 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];

我们得到了:

enter image description here

我们会发现rightView的框架会自动更改为正值,即(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];

enter image description here

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

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

enter image description here

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

enter image description here

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

总结:

  1. view.bounds确定其子视图的所有位置(由bounds.origin偏移),而bounds不会影响其在超级视图中的位置。

  2. 如果您使用负宽度和高度初始化视图,它将自动更改为正数(不会更改位置),但其bounds.origin表示您开始的位置&#34 ;绘制"观点。

答案 1 :(得分:22)

当其contentOffset不是(0,0)时,UIScrollView的bounds.origin不会是(0,0)。

答案 2 :(得分:16)

如果使用负宽度/高度初始化视图,bounds.origin将为负数。 例如,如果你做了

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

亲自试试!

答案 3 :(得分:0)

(再次编辑,因为我在接受之后无法删除我原来的答案 - 这是归功于ian,他在下面发布了一个更全面的答案:)

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