如何定义布局约束以使一个标签保持其内容的宽度并允许另一个标签填充剩余空间?

XJo*_*nes 1 ios autolayout nslayoutconstraint

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

| - [LABEL1] - [标签2 --------------] - [按钮] - |

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

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

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

[NSLayoutConstraint
 constraintsWithVisualFormat:@"H:|-8-[label1]-4-[label2]-4-[button]-8-|"
 options:0
 metrics:nil
 views:views];
Run Code Online (Sandbox Code Playgroud)

这导致以下布局:

| - [LABEL1 ----------------------] - [标签2] - [按钮] - |

:我怎么能修改约束,以便label2按比例尺寸和labelbutton的大小以适合的内容?

- 编辑 -

如果有帮助,这里是创建上述样本生成的约束的等效代码.

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];
Run Code Online (Sandbox Code Playgroud)

XJo*_*nes 5

@ ilya的答案是部分解决方案.它确实不会label1扩展,但label2仍然可以扩展到我想要的区域button,并且`按钮可以被压缩.经过一些试验和错误以及阅读所有文档后,我发现了一个更好,更合适的解决方案.乐趣学习自动布局.

而不是指定最小宽度label1,这有点人为,并且还根据视图内容留下其他问题,更好的解决方案是为所有视图设置contentCompressionResistancePrioritycontentHuggingPriority.

只要我还添加以下内容,我的问题中显示的约束也能很好地工作:

    [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];
Run Code Online (Sandbox Code Playgroud)