UIView的bounds.origin
何时不是(0, 0)
?
This post对我有帮助:
注意!!界限X和Y,原点,是在内部移动 视图。对于示例X + 5,将5pix移动到帧原点的左侧 意思是将此视图中的所有内容绘制到框架的左侧5pix 起源。它对自己没有任何作用,它正是它所吸引的 受到影响。
但它仅描述了我自己设置bounds.origin
值的情况
在其他情况下bounds.origin != (0, 0)
的价值?
答案 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];
我们得到了:
我们会发现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];
因此界限使得rightView的子视图遵循我们初始化的原点。
如果我们将rightView的边界更改为leftView: rightView.bounds = leftView.bounds; 然后两个子视图位置是相同的,我们丢失了rightView的宽度和高度为负的信息。
我们改变了leftView的边界而不是rightView: CGRect bounds = leftView.bounds; bounds.origin = CGPointMake(50,50); leftView.bounds = bounds;
我们可以看到,它的子视图的frame.origin被bounds.origin偏移(使用减号,而不是加号)。
总结:
view.bounds
确定其子视图的所有位置(由bounds.origin偏移),而bounds
不会影响其在超级视图中的位置。
如果您使用负宽度和高度初始化视图,它将自动更改为正数(不会更改位置),但其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的原点。