由于我问的问题已经被多次看到,我将提供详细的答案。如果您想添加更多正确的内容,请随意修改。
首先回顾一下这个问题:框架、边界和中心以及它们的关系。
Frame一个视图的frame
(CGRect
) 是其矩形在superview
的坐标系。默认情况下,它从左上角开始。
Bounds一个视图的bounds
(CGRect
) 在其自己的坐标系中表示视图矩形。
Center A center
is a CGPoint
表达为superview
的坐标系,它确定视图的精确中心点的位置。
取自UIView + 位置 http://bynomial.com/blog/?p=24这些是先前属性之间的关系(它们在代码中不起作用,因为它们是非正式方程):
NOTE:如果视图旋转,这些关系不适用。欲了解更多信息,我建议您查看以下来自厨房抽屉 http://littlehales.wordpress.com/基于斯坦福CS193p http://cs193p.stanford.edu课程。积分转到@Rhubarb.
使用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
, the 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
is at (0.0, 0.0)
(左上角)。例如,如果您更改origin
for view1
你可以看到(如果需要的话可以评论前面的代码)现在左上角view2
触及view1
一。动机很简单。你说view1
它的左上角现在位于该位置(20.0, 20.0)
但是由于view2
's frame
origin
开始于(20.0, 20.0)
,它们将重合。
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
The origin
代表view
在其范围内的地位superview
但描述了bounds
中心。
最后,bounds
and 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)开始,它们会重合。
其他参考资料(如果需要,可以更新其他参考资料)
- UI视图几何 http://littlehales.wordpress.com/2012/01/24/uiview-geometry/
- UIView 框架和边界 http://blog.carbonfive.com/2010/05/27/uiview-frames-and-bounds/
About clipsToBounds
(来源苹果文档)
将此值设置为 YES 会导致子视图被剪切到边界
接收器的。如果设置为 NO,则其框架超出范围的子视图
接收器的可见边界不会被剪裁。默认值为
不。
换句话说,如果一个视图frame
is (0, 0, 100, 100)
它的子视图是(90, 90, 30, 30)
,您将仅看到该子视图的一部分。后者不会超出父视图的边界。
masksToBounds
相当于clipsToBounds
。而是到一个UIView
,该属性应用于CALayer
。在引擎盖下,clipsToBounds
calls masksToBounds
。如需进一步参考,请查看UIView的clipsToBounds和CALayer的maskToBounds之间的关系如何? https://stackoverflow.com/questions/1177775/how-is-the-relation-between-uiviews-clipstobounds-and-calayers-maskstobounds.