【发布时间】:2014-11-05 08:22:01
【问题描述】:
我在 iOS 8 上遇到了 VFL 中的约束问题,而在 6 和 7 上一切正常。这是约束:
H:|-margin-[_imageView]-(=>margin)-[_label]-margin-|
_imageView_ 和 _label 都获得了正确的固有宽度,并且边距按预期增长。我要实现
|-[_imageView]-------------------------------[some text]-|
|-[_imageView]---------------------------[a larger text]-|
|-[_imageView]-----------------------[a very large text]-|
|-[_imageView]-[a very very very very very very larg...]-|
视觉上没问题,但它引发了一个损坏的约束异常:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7b856ee0 H:[UIImageView:0x7b8ef1f0]-(>=12)-[UILabel:0x7b8e7c60'Test']>
打印_autolayoutTrace后没有歧义。
但是,如果约束仅涉及标签,则根本没有问题:
H:|-margin-[_label1]-(=>margin)-[_label2]-margin-|
问题可以通过以下步骤解决:
更改删除>= 并添加优先级的约束:
H:|-margin-[_imageView]-(margin@750)-[_label]-margin-|
设置_imageView的拥抱优先级
[_imageView setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
设置_label的抗压性
[_label setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
有了这些规则,在任何平台上都没有问题。在 iOS 8 上所有这些都是必需的吗?是bug还是我做错了?
谢谢。
【问题讨论】:
-
我的猜测是,被破坏的约束来自于文本字符串太长而无法遵守 ">=12";即边距+图像+文本的宽度超过了父视图的宽度。确实,iOS 8 引入了布局边距,但我不太了解 VFL 语句如何影响这些边距以提供任何帮助。您可以将标签的行高设置为 0,以便它可以垂直扩展并仍然保持水平约束吗?
-
@NRitH 无论文本长度如何,约束总是被打破。我无法更改标签的行数,文本必须被截断。
-
您能否发布完整的日志和堆栈跟踪,说明它何时抱怨约束被破坏?如果不设置内容拥抱优先级和标签的抗压性会怎样?
-
你试过在 UILabel 上使用 preferredMaxLayoutWidth 吗?设置这个对我解决自动布局问题有很多帮助。您可以将 preferredMaxLayoutWidth 设置为视图的宽度,即 imageView 的宽度减去您尝试实现的填充。
-
我无法复制这个。我已经从头开始设置了一个快速示例,它的行为似乎符合我的要求,使用以下内容:
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[imageView]-(>=margin)-[label]-margin-|" options:0 metrics:@{@"margin": @10} views:bindings]];
标签: ios autolayout constraints ios8