自动布局 - 使视图的尺寸依赖于另一个视图的

Posted

技术标签:

【中文标题】自动布局 - 使视图的尺寸依赖于另一个视图的【英文标题】:Auto Layout - make a view's dimensions dependent on another view's 【发布时间】:2013-12-09 16:57:30 【问题描述】:

简单的交易:我想将 UIView 的宽度设为其父视图宽度的一半。这是我的代码:

//Display a red rectangle:
UIView *redBox = [[UIView alloc] init];
[redBox setBackgroundColor:[UIColor redColor]];
[redBox setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:redBox];

//Make its height equal to its superview's,
//minus standard spacing on top and bottom:
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[redBox]-|" options:0 metrics:nil views:@@"redBox": redBox];
[self.view addConstraints:constraints];

//Make its width half of its superviews's width (the problem):
NSLayoutConstraint *constraint = [NSLayoutConstraint
                                  constraintWithItem:redBox
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                                  attribute:NSLayoutAttributeWidth
                                  multiplier:0.5
                                  constant:0.0
                                  ];

[self.view addConstraint:constraint];

[self.view setBackgroundColor:[UIColor blueColor]];

这是我得到的:

如果我将multiplier 设置为1.0,则视图的宽度是其父视图的一半。但这是为什么呢?

【问题讨论】:

self.view 上设置背景颜色可能很有用,只是为了确保它也是您期望的大小。 完成,我更新了问题和截图。这是一个新的 UIViewController,所以 self.view 应该有默认尺寸。 这段代码在哪里调用?视图加载?一个单独的方法?如果在 viewDidLoad 之后调用,请尝试调用 [self.view layoutIfNeeded]。 是的,它在viewDidLoad 中调用。我试过打电话给[self.view layoutIfNeeded],但没有帮助。如果您将其复制并粘贴到空 ViewController 的 viewDidLoad 中,您应该会得到相同的结果。 layoutIfNeeded 应该不是必需的,因为只要添加了约束,视图就会自动再次运行布局。 【参考方案1】:

问题可能是您的红框视图约束不足。你给了它一个宽度,但没有告诉它它应该水平放置自己的位置。由于它应该是父视图宽度的一半,它可以选择将自己定位在父视图的左半边。或者右半边。或者中间。你没有指定,所以框架只是选择了一些东西。

在这种情况下,它看起来像是选择将红色框的 center 与 superview 的左边缘对齐。这似乎是一个奇怪的选择,但同样,您没有指定任何内容。它可以选择任何它想要的东西。

添加另一个将视图水平定位的约束。这应该可以解决问题。

【讨论】:

你是对的。我的代码 为子视图提供了正确的大小,但其中一部分位于视图框架之外。我不得不添加这个:constraint = [NSLayoutConstraint constraintWithItem:redBox attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0 ];

以上是关于自动布局 - 使视图的尺寸依赖于另一个视图的的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局使超级视图适合最大的内在大小子视图

使用自动布局进行编辑时在表格视图中调整子视图的大小

如何使自动布局约束依赖于多个其他锚?

由于自动布局没有计算尺寸,将子视图添加到自定义视图最终会出错

自动布局视图在不同的屏幕尺寸上总是相同的尺寸

如何使自动布局约束依赖于多个其他锚点?