作者:大小姐_T_841 | 来源:互联网 | 2023-10-14 10:44
由于我提出的问题已被多次看到,因此我将提供详细的答案。如果您想添加更多正确的内容,请随意修改它。
首先回顾一下这个问题:框架、边界和中心以及它们之间的关系。
视图的frame
( CGRect
) 是其矩形在superview
的坐标系中的位置。默认情况下,它从左上角开始。
视图的bounds
( CGRect
) 在其自己的坐标系中表示视图矩形。
Acenter
以的坐标系CGPoint
表示superview
,它确定了视图的确切中心点的位置。
取自
这些是先前属性之间的关系(它们在代码中不起作用,因为它们是非正式方程):
*
使用frame
允许您在其superview
. 通常可以从 中使用superview
,例如,当您创建特定的子视图时。例如:
// view1 will be positioned at x = 30, y = 20 starting the top left corner of [self view]
// [self view] could be the view managed by a UIViewController
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
当您需要在 a 内绘制坐标时,view
您通常会参考bounds
.
一个典型的例子是在view
一个子视图中绘制作为第一个的插图。绘制子视图需要知道bounds
父视图的。例如:
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];
当您更改bounds
视图时会发生不同的行为。例如,如果您更改bounds
size
,则frame
更改(反之亦然)。更改发生在center
视图周围。使用下面的代码,看看会发生什么:
NSLog(@"Old Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"Old Center %@", NSStringFromCGPoint(view2.center));
CGRect frame = view2.bounds;
frame.size.height += 20.0f;
frame.size.width += 20.0f;
view2.bounds = frame;
NSLog(@"New Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"New Center %@", NSStringFromCGPoint(view2.center));
此外,如果您更改bounds
origin
您的origin
内部坐标系。默认情况下origin
位于(0.0,
0.0)
(左上角)。例如,如果您更改origin
for,view1
您可以看到(如果需要,请注释之前的代码)现在左上角
forview2
触及了那个view1
。动机很简单。你说它的view1
左上角现在在那个位置(20.0,
20.0)
,但是由于view2
‘frame
origin
从 开始(20.0, 20.0)
,它们会重合。
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
origin
表示view
‘ 在其内的位置superview
,但描述了bounds
中心的位置。
最后,bounds
和origin
是不相关的概念。两者都允许导出frame
视图(参见前面的方程)。
View1 的案例研究
这是使用以下代码段时发生的情况。
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
NSLog(@"view1's frame is: %@", NSStringFromCGRect([view1 frame]));
NSLog(@"view1's bounds is: %@", NSStringFromCGRect([view1 bounds]));
NSLog(@"view1's center is: %@", NSStringFromCGPoint([view1 center]));
相对图像。
相反,如果我[self view]
像下面这样改变界限会发生什么。
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setbounds:rect];
相对图像。
这里你说它的[self view]
左上角现在在 (30.0, 20.0) 的位置,但是由于view1
的帧原点是从 (30.0, 20.0)
开始的,所以它们会重合。
(如果需要,可以使用其他参考资料进行更新)
关于clipsToBounds
(来源 Apple 文档)
将此值设置为 YES 会导致子视图被裁剪到接收器的边界。如果设置为 NO,其帧超出接收器可见边界的子视图不会被剪裁。默认值为 NO。
换句话说,如果一个视图的frame
is(0, 0, 100, 100)
和它的子视图是(90, 90, 30,
30)
,您将只能看到该子视图的一部分。后者不会超出父视图的范围。
masksToBounds
相当于clipsToBounds
。而不是 a UIView
,此属性应用于 aCALayer
。在引擎盖下,clipsToBounds
调用masksToBounds
. 如需进一步参考,请查看UIView 的
clipsToBounds 和 CALayer 的 maskToBounds
之间的关系如何?.