UIView frame, bounds and center
我想知道如何以正确的方式使用这些属性。
据我所知,
也可以从我正在创建的视图的容器中使用
最后,
你能提供更多关于
由于我问的问题已经被多次看到,我将提供一个详细的答案。如果您想添加更多正确的内容,请随意修改。
首先回顾一下这个问题:框架、边界和中心以及它们之间的关系。
框架视图的
边界视图的
中心a
从uiview+位置上看,这些是以前属性之间的关系(由于它们是非正式的方程式,因此它们在代码中不起作用):
frame.origin = center - (bounds.size / 2.0) center = frame.origin + (bounds.size / 2.0) frame.size = bounds.size
注意:如果视图旋转,这些关系不适用。如需更多信息,我建议您查看以下图片,这些图片来自斯坦福CS193P课程的厨房抽屉。学分归@rhubarb。
使用
1 2 3 4 5 6 | // 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]; |
当你需要在一个
1 2 3 4 5 6 7 | 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]; |
当您更改视图的
1 2 3 4 5 6 7 8 9 10 | 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)); |
此外,如果更改
1 2 3 4 | CGRect frame = view1.bounds; frame.origin.x += 20.0f; frame.origin.y += 20.0f; view1.bounds = frame; |
最后,
视图1的案例研究
下面是使用以下代码片段时发生的情况。
1 2 3 4 5 6 7 8 | 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])); |
相对图像。
相反,如果我像下面那样改变
1 2 3 4 5 | // previous code here... CGRect rect = [[self view] bounds]; rect.origin.x += 30.0f; rect.origin.y += 20.0f; [[self view] setBounds:rect]; |
相对图像。
这里你对
附加引用(如果需要,使用其他引用更新)
- UIVIEW几何
- ui查看框架和边界
关于
Setting this value to YES causes subviews to be clipped to the bounds
of the receiver. If set to NO, subviews whose frames extend beyond the
visible bounds of the receiver are not clipped. The default value is
NO.
换句话说,如果一个视图的
这个问题已经有了一个很好的答案,但我想补充一些图片。我的完整答案在这里。
为了帮助我记住画框,我想到了墙上的画框。就像图片可以移动到墙上的任何地方一样,视图框架的坐标系是超级视图。(墙=超视图,框架=视图)
为了帮助我记住边界,我想到了篮球场的边界。篮球在球场内的某个地方,就像视界的坐标系在视界内一样。(court=视图,basketball/players=视图中的内容)
与框架一样,view.center也位于超级视图的坐标中。
帧与边界-示例1黄色矩形表示视图的框架。绿色矩形表示视图的边界。两幅图像中的红点代表坐标系中帧或边界的原点。
1 2 3 4 5 6 7 8 9 | Frame origin = (0, 0) width = 80 height = 130 Bounds origin = (0, 0) width = 80 height = 130 |
1 2 3 4 5 6 7 8 9 | Frame origin = (40, 60) // That is, x=40 and y=60 width = 80 height = 130 Bounds origin = (0, 0) width = 80 height = 130 |
1 2 3 4 5 6 7 8 9 | Frame origin = (20, 52) // These are just rough estimates. width = 118 height = 187 Bounds origin = (0, 0) width = 80 height = 130 |
这与示例2相同,只是这次显示的是视图的整个内容,如果不将其剪切到视图的边界,则显示的是它的外观。
1 2 3 4 5 6 7 8 9 | Frame origin = (40, 60) width = 80 height = 130 Bounds origin = (0, 0) width = 80 height = 130 |
1 2 3 4 5 6 7 8 9 | Frame origin = (40, 60) width = 80 height = 130 Bounds origin = (280, 70) width = 80 height = 130 |
再次,请参阅此处了解我的答案,并提供更多详细信息。
我发现这张图片对理解框架、边界等很有帮助。
另外,请注意,当图像旋转时,
我想如果你从
框架实际上并不是视图或层的一个独特属性,它是一个虚拟属性,从边界、位置(
因此,基本上,层/视图布局是如何真正由这三个属性(和AnchorPoint)决定的,并且这三个属性中的任何一个都不会更改任何其他属性,就像更改转换不会更改边界一样。
这篇文章有很好的答案和详细的解释。我只是想说,对于WWDC 2011视频理解uikit呈现中的帧、边界、中心、转换、边界原点的含义,还有另一种解释,从@4:22到20:10。
在阅读了以上答案之后,这里添加了我的解释。
假设在网上浏览,web浏览器就是你的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(100.0f, 200.0f, 200.0f, 400.0f)]; [view1 setBackgroundColor:[UIColor redColor]]; UIView *view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)]; [view2 setBackgroundColor:[UIColor yellowColor]]; [view1 addSubview:view2]; [[self view] addSubview:view1]; NSLog(@"Old view1 frame %@, bounds %@, center %@", NSStringFromCGRect(view1.frame), NSStringFromCGRect(view1.bounds), NSStringFromCGPoint(view1.center)); NSLog(@"Old view2 frame %@, bounds %@, center %@", NSStringFromCGRect(view2.frame), NSStringFromCGRect(view2.bounds), NSStringFromCGPoint(view2.center)); // Modify this part. CGRect bounds = view1.bounds; bounds.origin.x += 10.0f; bounds.origin.y += 10.0f; // incase you need width, height //bounds.size.height += 20.0f; //bounds.size.width += 20.0f; view1.bounds = bounds; NSLog(@"New view1 frame %@, bounds %@, center %@", NSStringFromCGRect(view1.frame), NSStringFromCGRect(view1.bounds), NSStringFromCGPoint(view1.center)); NSLog(@"New view2 frame %@, bounds %@, center %@", NSStringFromCGRect(view2.frame), NSStringFromCGRect(view2.bounds), NSStringFromCGPoint(view2.center)); |