更改视图边界会影响框架

Sma*_*kon 3 frame uiview bounds ios cgrect

我试图了解一个视图如何响应它的边界被改变.如果我更改视图的边界原点,它会相应地更改帧原点吗?

例如

UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(150, 150, 150, 200)];
greenView.backgroundColor = [UIColor colorWithRed:0.494 green:0.827
                                             blue:0.129 alpha:1];
[self.view addSubview:greenView];
greenView.bounds = CGRectMake(0, 150, greenView.bounds.size.width, greenView.bounds.size.height);
Run Code Online (Sandbox Code Playgroud)

这不会将框架的原点改为(150,300)吗?运行上面的代码似乎没有改变它的框架.(我知道你不是要用边界改变观点位置,这只是一个假设).

Abh*_*nav 7

根据Apple文档,这里是视图的框架,边界和中心之间的关系:

虽然您可以独立于其他属性更改框架,边界和中心属性,但是对一个属性的更改会以下列方式影响其他属性:

  • 设置frame属性时,bounds属性中的size值会更改以匹配框架矩形的新大小.
    中心属性中的值类似地更改以匹配
    框架矩形的新中心点.
  • 设置center属性时,框架中的原点值会相应更改.
  • 设置bounds属性的大小时,frame属性中的size值将更改为与bounds矩形的新大小匹配.

所以,回答你的问题,改变View的边界上的X,Y位置不应该影响帧.大多数情况下的边界以(0,0)开头.将高度或宽度更改为负值将允许边界的起点变为负值.

编辑:回答OP问题 - 不,改变边界的位置不会以任何方式影响帧.由于边界是参考视图自己的坐标系统,因此在自协调系统中改变X,Y不会改变superview的坐标系统中的位置.

您可以尝试使用两个自定义视图,如下所示:

UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 100.0f, 150.0f, 150.0f)];
view1.backgroundColor = [UIColor redColor];

NSLog(@"view1.bounds = %@", NSStringFromCGRect(view1.bounds));
NSLog(@"view1.frame = %@", NSStringFromCGRect(view1.frame));

UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
view2.backgroundColor = [UIColor yellowColor];

NSLog(@"view2.bounds = %@", NSStringFromCGRect(view2.bounds));
NSLog(@"view2.frame = %@", NSStringFromCGRect(view2.frame));

NSLog(@"view1.bounds = %@", NSStringFromCGRect(view1.bounds));
NSLog(@"view1.frame = %@", NSStringFromCGRect(view1.frame));

NSLog(@"view2.bounds = %@", NSStringFromCGRect(view2.bounds));
NSLog(@"view2.frame = %@", NSStringFromCGRect(view2.frame));

[view1 addSubview:view2];
Run Code Online (Sandbox Code Playgroud)

然后像这样更改子视图绑定:

CGRect frame = view2.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view2.bounds = frame;
Run Code Online (Sandbox Code Playgroud)

改变界限根本不会影响帧.两个视图在屏幕上看起来都一样:

在此输入图像描述 在此输入图像描述

最后,尝试通过更改父视图的边界来查看下面的屏幕:

CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述