系统布局大小配件大小:UILayoutFitting压缩大小不压缩



我在iOS 8.X e iOS7.X中的自动布局和UITableView标头(tableHeaderView)有问题。

self.HeaderView是使用自动布局构建的XIB。它在滚动查看器中使用,后面跟着其他视图,结果是正确的。

然后我将其设置为表视图的标题(如这里所述):

self.tableView.tableHeaderView = self.HeaderView;
[self.HeaderView setNeedsLayout];
[self.HeaderView layoutIfNeeded];
CGSize headerViewSize = [self.HeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
CGRect frame = self.HeaderView.frame;
frame.size.height = headerViewSize.height;
self.HeaderView.frame = frame;
self.tableView.tableHeaderView = self.HeaderView;

但是所得到的高度比预期的要大。我不明白为什么。约束似乎还可以,否则为什么在滚动视图中结果是正确的?

如果在IB中,我调整了容器框架的高度,则会更新约束,不会有任何歧义。

为什么UILayoutFittingCompressedSize不压缩视图?

#update

我发现了这个问题。基本上,约束是正确的。

调用layoutSubviews后,UIImageView的大小正确。宽度和高度如预期。问题出在systemLayoutSizeFittingSize:UILayoutFittingCompressedSize的工作方式上。

它不是使用UIImageView大小(已正确调整大小)来计算大小,而是使用UIImage的大小(哪个源文件更大)

那么,我该怎么做才能强制systemLayoutSizeFittingSize:UILayoutFittingCompressedSize使用UIImageView大小来计算大小呢??

找到了解决方案。

简而言之,限制是可以的,在iOS8上systemLayoutSizeFittingSize:UILayoutFittingCompressedSize按预期工作,但在iOS7上没有。

出于纯粹的巧合,我称的组合

[self.HeaderView setNeedsLayout];
[self.HeaderView layoutIfNeeded];

两次,我注意到系统LayoutSizeFittingSize:UILayoutFittingCompressedSize也在iOS7上运行。

在那一刻,我意识到解决方案是按顺序调用上述组合两次(在iOS 8上没有必要)

如果能理解为什么

以下是我所做的:我为头视图创建约束,使其左右与表视图相等,优先级为UILayoutPriorityDefaultHigh。当头视图移动到didMoveToWindow中的非nil窗口时,我将这些约束添加到tableView中:当它从willMoveToSuperview中的超级视图中删除时,我会删除它们。设置好后,我使用systemLayoutSizeFittingSize,但传入self.frame,然后将其设置为tableHeaderView。

这似乎很有效,包括轮换。添加/删除约束的顺序对于避免UILayout发出警告非常重要。

最新更新