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

Ios 如何定义布局约束,使一个标签保持其内容的宽度,并允许另一个标签填充剩余空间?,ios,autolayout,nslayoutconstraint,Ios,Autolayout,Nslayoutconstraint,考虑以下所需的布局。请注意,这不是“布局字符串”,而是图片的代理。所以|=超级视图边,-=空间,[xxx]=视图 |--[label1]-[label2----------------]-[button]--| 上面的布局就是我想要实现的。英文: label1大小适合内容,并从superview的边缘填充 label2从label1的边缘填充,并根据可用的水平空间展开/收缩 按钮的大小适合于内容,并从标签2的边缘和superview的右边缘填充 我希望这是清楚的。我的当前约束定义为: [NS

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

|--[label1]-[label2----------------]-[button]--|

上面的布局就是我想要实现的。英文:

  • label1
    大小适合内容,并从superview的边缘填充
  • label2
    label1
    的边缘填充,并根据可用的水平空间展开/收缩
  • 按钮的大小适合于内容,并从
    标签2的边缘和superview的右边缘填充
我希望这是清楚的。我的当前约束定义为:

[NSLayoutConstraint
 constraintsWithVisualFormat:@"H:|-8-[label1]-4-[label2]-4-[button]-8-|"
 options:0
 metrics:nil
 views:views];
这将导致以下布局:

|--[label1----------------------[label2]--[button]--|

问题:如何修改约束,使
标签2
的大小成比例,而
标签
按钮
的大小适合内容

--编辑-- 如果有帮助的话,下面是创建上述示例生成的约束的等效代码

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];

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

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

@ilya的答案是部分解决方案。它确实阻止了
label1
的扩展,但是
label2
仍然可以扩展到我想要的
按钮
所在的区域,并且`按钮可以被压缩。经过一些尝试和错误,并阅读了所有文档,我找到了一个更好、更合适的解决方案。学习自动布局很有趣

与其为
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];

@伊利亚的答案是部分解决方案。它确实阻止了
label1
的扩展,但是
label2
仍然可以扩展到我想要的
按钮
所在的区域,并且`按钮可以被压缩。经过一些尝试和错误,并阅读了所有文档,我找到了一个更好、更合适的解决方案。学习自动布局很有趣

与其为
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];

谢谢,成功了。我发现了另一个问题,也许你能回答。如果
label2
中的文本太长,需要截断,
按钮
正在压缩。如何更改约束以确保
按钮始终为其所需宽度,并且要挤压的第一个视图始终为
label2
。其他约束只需在
label2
宽度变为0时进行调整。没关系,我发现我需要使用
[按钮设置内容压缩阻力优先级:forAxis]
我找到了一个更好的解决方案,它不需要设置最小宽度。见我贴出的答案。无论如何,谢谢你的帮助。谢谢,这很有效。我发现了另一个问题,也许你能回答。如果
label2
中的文本太长,需要截断,
按钮
正在压缩。如何更改约束以确保
按钮始终为其所需宽度,并且要挤压的第一个视图始终为
label2
。其他约束只需在
label2
宽度变为0时进行调整。没关系,我发现我需要使用
[按钮设置内容压缩阻力优先级:forAxis]
我找到了一个更好的解决方案,它不需要设置最小宽度。见我贴出的答案。无论如何谢谢你的帮助。