iOS 8自动布局,VFL和保证金等于或大于

时间:2014-09-11 11:41:50

标签: ios autolayout constraints ios8

我在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上所有这些都是必需的吗?这是一个错误还是我做错了?

感谢。

1 个答案:

答案 0 :(得分:5)

我从头开始项目,这是我的代码(实际上工作正常):

UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
topView.backgroundColor = [UIColor redColor];
topView.translatesAutoresizingMaskIntoConstraints = NO;

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 40, 160)];
imageView.backgroundColor = [UIColor greenColor];
imageView.translatesAutoresizingMaskIntoConstraints = NO;
[topView addSubview:imageView];

self.label = [[UILabel alloc] initWithFrame:CGRectMake(80, 80, 200, 32)];
self.label.backgroundColor = [UIColor yellowColor];
self.label.text = @"some text";
self.label.translatesAutoresizingMaskIntoConstraints = NO;
[topView addSubview:self.label];


self.tableView.tableHeaderView = topView;

NSDictionary *views = @{@"imageView":imageView, @"label":self.label};

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[imageView(40)]-(>=margin)-[label]-margin-|" options:0 metrics:@{@"margin": @30} views:views];
NSArray *imageConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[imageView(160)]-20-|" options:0 metrics:nil views:views];
NSArray *textConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[label]" options:0 metrics:nil views:views];
NSArray *topConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[topView(320)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(topView)];

[topView addConstraints:constraints];
[topView addConstraints:imageConstraints];
[topView addConstraints:textConstraints];
[topView addConstraints:topConstraints];

我认为你的主要问题是你不能关闭产生translatesAutoresizingMaskIntoConstraints的{​​{1}}(我在iOs8之前从未见过)。我还没有找到一个记录良好的地方,但是有很多关于这种约束的问题。

我也创建了github repo,所以你可以自己试一试:https://github.com/Nikita2k/constraintsTest

此外,您还可以查看WWDC2014视频 - 表和集合视图中的新功能(约20分钟)。有一些信息,您现在可以看到UIView-Encapsulated-Layout问题,但稍后会修复。此外,您可以尝试使用UIView-Encapsulated-Layout,因为故事板(或xib)中的所有ios8 tableView都应该明确设置

rowHeight

我不确定,它是否会对这个特殊情况有所帮助,但也要尝试一下!