1

考虑以下所需的布局。请注意,这不是“布局字符串”,而是图片的代理。所以| = 超级视图边缘,- = 空间,[xxx] = 视图。

|--[label1]--[label2--------------]--[按钮]--|

上面的布局是我想要实现的。用英语讲:

  • label1大小以适合内容并从超级视图的边缘填充
  • label2从边缘填充label1并根据可用水平空间扩展/收缩
  • button大小适合内容,并从label2父视图的边缘和右边缘填充

我希望这很清楚。我当前的约束定义为:

[NSLayoutConstraint
 constraintsWithVisualFormat:@"H:|-8-[label1]-4-[label2]-4-[button]-8-|"
 options:0
 metrics:nil
 views:views];

这导致以下布局:

|--[label1----------]--[label2]--[按钮]--|

问题:如何修改约束,使其label2按比例调整大小并label调整button大小以适合内容?

- 编辑 -

如果有帮助,这里是创建上述示例生成的约束的等效代码。

NSLayoutConstraint *c1 = [NSLayoutConstraint
                          constraintWithItem:self.label1
                          attribute:NSLayoutAttributeLeading
                          relatedBy:NSLayoutRelationEqual
                          toItem:self
                          attribute:NSLayoutAttributeLeading
                          multiplier:1.0f
                          constant:8.0f];

NSLayoutConstraint *c2 = [NSLayoutConstraint
                          constraintWithItem:self.label2
                          attribute:NSLayoutAttributeLeading
                          relatedBy:NSLayoutRelationEqual
                          toItem:self.label1
                          attribute:NSLayoutAttributeTrailing
                          multiplier:1.0f
                          constant:4.0f];

NSLayoutConstraint *c3 = [NSLayoutConstraint
                          constraintWithItem:self.button
                          attribute:NSLayoutAttributeLeading
                          relatedBy:NSLayoutRelationEqual
                          toItem:self.label2
                          attribute:NSLayoutAttributeTrailing
                          multiplier:1.0f
                          constant:4.0f];

NSLayoutConstraint *c4 = [NSLayoutConstraint
                          constraintWithItem:self
                          attribute:NSLayoutAttributeTrailing
                          relatedBy:NSLayoutRelationEqual
                          toItem:self.button
                          attribute:NSLayoutAttributeTrailing
                          multiplier:1.0f
                          constant:8.0f];
4

2 回答 2

5

@ilya 的答案是部分解决方案。它确实不会label1扩大,但label2仍然可以延伸到我想进入的区域button,并且可以压缩“按钮”。经过反复试验并阅读所有文档后,我找到了更好、更合适的解决方案。学习自动布局很有趣。

与其指定 的最小宽度label1,这有点人为,并且还会根据视图内容留下其他问题,更好的解决方案是为所有视图设置contentCompressionResistancePriority和。contentHuggingPriority

只要我还添加以下内容,我的问题中显示的约束就可以完美地工作:

    [self.label1
     setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh
     forAxis:UILayoutConstraintAxisHorizontal];
    [self.label1
     setContentHuggingPriority:UILayoutPriorityDefaultLow
     forAxis:UILayoutConstraintAxisHorizontal];
    [self.label2
     setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
     forAxis:UILayoutConstraintAxisHorizontal];
    [self.label2
     setContentHuggingPriority:UILayoutPriorityDefaultHigh
     forAxis:UILayoutConstraintAxisHorizontal];
    [self.button
     setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh
     forAxis:UILayoutConstraintAxisHorizontal];
    [self.button
     setContentHuggingPriority:UILayoutPriorityDefaultLow
     forAxis:UILayoutConstraintAxisHorizontal];
于 2013-09-27T05:09:28.077 回答
1

只需添加另一个宽度label1为等于某个最小尺寸的约束(例如,在界面构建器中,当您添加宽度约束时,它将自动使用当前宽度)但将其优先级设置为较低。

于 2013-09-27T00:06:25.183 回答