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