热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UIView框架、边界和中心

UIVi

由于我提出的问题已被多次看到,因此我将提供详细的答案。如果您想添加更多正确的内容,请随意修改它。

首先回顾一下这个问题:框架、边界和中心以及它们之间的关系。

视图的frame( CGRect) 是其矩形在superview的坐标系中的位置。默认情况下,它从左上角开始。

视图的bounds( CGRect) 在其自己的坐标系中表示视图矩形。

Acenter以的坐标系CGPoint表示superview,它确定了视图的确切中心点的位置。

取自
这些是先前属性之间的关系(它们在代码中不起作用,因为它们是非正式方程):


  • frame.origin = center - (bounds.size / 2.0)


  • center = frame.origin + (bounds.size / 2.0)


  • frame.size = bounds.size


*

UIView 框架、边界和中心

使用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视图时会发生不同的行为。例如,如果您更改boundssize,则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)
(左上角)。例如,如果您更改originfor,view1您可以看到(如果需要,请注释之前的代码)现在左上角
forview2触及了那个view1。动机很简单。你说它的view1左上角现在在那个位置(20.0,
20.0)
,但是由于view2frame 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中心的位置。

最后,boundsorigin是不相关的概念。两者都允许导出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]));

相对图像。

UIView 框架、边界和中心

相反,如果我[self view]像下面这样改变界限会发生什么。

// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setbounds:rect];

相对图像。

UIView 框架、边界和中心

这里你说它的[self view]左上角现在在 (30.0, 20.0) 的位置,但是由于view1的帧原点是从 (30.0, 20.0)
开始的,所以它们会重合。

(如果需要,可以使用其他参考资料进行更新)


  • UIView 几何

  • UIView 框架和边界

关于clipsToBounds(来源 Apple 文档)

将此值设置为 YES 会导致子视图被裁剪到接收器的边界。如果设置为 NO,其帧超出接收器可见边界的子视图不会被剪裁。默认值为 NO。

换句话说,如果一个视图的frameis(0, 0, 100, 100)和它的子视图是(90, 90, 30,
30)
,您将只能看到该子视图的一部分。后者不会超出父视图的范围。

masksToBounds相当于clipsToBounds。而不是 a UIView,此属性应用于 aCALayer。在引擎盖下,clipsToBounds调用masksToBounds. 如需进一步参考,请查看UIView 的
clipsToBounds 和 CALayer 的 maskToBounds
之间的关系如何?.





推荐阅读
author-avatar
大小姐_T_841
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有