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

Ber*_*rgP 34 objective-c uiview bounds ios

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

这篇文章对我有帮助:

重要!!边界X和Y是原点,用于在视图内移动.对于示例X + 5,将5pix移动到框架原点的左侧意味着将此视图中的所有内容绘制到框架原点的左侧5pix.它对自己没有任何作用,它正在吸引它受到影响.

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

Sug*_*gar 31

视图的框架确定其在超视图中的位置.视图的边界确定其子视图位置.这意味着,如果更改视图的边界,其位置将不会更改,但其所有子视图位置都将更改.

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

frame1 = CGRectMake(100, 100, -50, -50) 
Run Code Online (Sandbox Code Playgroud)

与...完全相同

frame2 = CGRectMake(50, 50, 50, 50). 
Run Code Online (Sandbox Code Playgroud)

事实上,如果使用frame1初始化视图,它将自动更改为frame2.

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];
Run Code Online (Sandbox Code Playgroud)

我们得到了:

在此输入图像描述

我们会发现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];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

在此输入图像描述

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

在此输入图像描述

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

总结:

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

  2. 如果您初始化具有负宽度和高度的视图,它将自动更改为正(这不会更改位置),但其bounds.origin表示您开始"绘制"视图的点.


Cos*_*syn 24

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


小智 16

如果初始化具有负宽度/高度的视图,bounds.origin将为负数.例如,如果你这样做了

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)];
Run Code Online (Sandbox Code Playgroud)

框架将是:

origin = {
  x = -5, 
  y = -15
}, 
size = {
  width = 10, 
  height = 20
}
Run Code Online (Sandbox Code Playgroud)

界限:

origin = {
  x = -10, 
  y = -20
}, 
size = {
  width = 10, 
  height = 20
}
Run Code Online (Sandbox Code Playgroud)

中央:

x = 0, 
y = -5
Run Code Online (Sandbox Code Playgroud)

亲自尝试吧!

  • 是否有意义,这些是您执行此代码时获得的结果. (2认同)

Noa*_*oon 0

(再次编辑,因为我可以\xe2\x80\x99t在被接受后删除我的原始答案\xe2\x80\x94,这归功于ian,他在下面发布了更彻底的答案:)

\n\n

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

\n

  • 我认为这不是真的。我见过一些情况,系统中与自动调整大小相关的某些东西似乎给我留下了一个原点不是 0.0.0 的界限。在我自己的代码中,我从来没有设置过界限,所以它突然呈现一个非零数字是令人震惊的。 (2认同)