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偏移(使用减号,而不是加号).
总结:
view.bounds
确定其所有子视图的位置(由bounds.origin偏移),而bounds
不会影响其在超级视图中的位置.
如果您初始化具有负宽度和高度的视图,它将自动更改为正(这不会更改位置),但其bounds.origin表示您开始"绘制"视图的点.
小智 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)
亲自尝试吧!
(再次编辑,因为我可以\xe2\x80\x99t在被接受后删除我的原始答案\xe2\x80\x94,这归功于ian,他在下面发布了更彻底的答案:)
\n\n在大多数情况下,这不会发生。如果使用负宽度和/或高度初始化视图,\xe2\x80\x99 将获得宽度为负 X 和/或高度为负 Y 的原点。
\n 归档时间: |
|
查看次数: |
9765 次 |
最近记录: |