我在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上所有这些都是必需的吗?这是一个错误还是我做错了?
感谢。
答案 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
我不确定,它是否会对这个特殊情况有所帮助,但也要尝试一下!