由于我提出的问题已被多次看到,我将提供一个详细的答案。如果您想要添加更多正确的内容,请随意修改它。
首先,重温一下这个问题:框架、界限和中心以及它们之间的关系。
框架风景frame (CGRect)是其矩形在superview的坐标系。默认情况下,它从左上角开始。
界风景bounds (CGRect)在自己的坐标系中表示视图矩形。
中心 A center是CGPoint以superview的坐标系,它决定了观点的精确中心点的位置。
摘自这些是以前属性之间的关系(它们在代码中不起作用,因为它们是非正式方程):frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
注:如果视图被旋转,则这些关系不适用。欲了解更多信息,我建议您查看以下图片基于当然可以。学分@大黄.
使用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 UIViewControllerUIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f
, 400.0f)]; view1.backgroundColor = [UIColor redColor];[[self view] addSubview:view1];
当您需要绘制内部的坐标时,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为view1现在,您可以看到(如果需要,请注释前面的代码)左上角view2触碰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(见以前的方程)。
视图1的案例研究
下面是使用以下代码段时发生的情况。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 doc)将此值设置为YES将使子视图被裁剪到接收方的边界。如果设置为no,其帧扩展到接收器的可见边界之外的子视图不会被裁剪。默认值为否。
换句话说,如果一个视图frame是(0, 0, 100, 100)它的子视图是(90, 90, 30, 30),您将只看到该子视图的一部分。后者不会超过父视图的界限。
masksToBounds等于clipsToBounds..取而代之的是UIView,则此属性应用于CALayer..在引擎盖下面,clipsToBounds打电话masksToBounds..有关进一步的参考资料,请参阅UIView的剪贴画-ToBound和CALayer的面具-ToBound之间的关系如何?.