systemLayoutSizeFittingSize:UILayoutFittingCompressedSize不能压缩

4

我在iOS 8.X和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不能压缩视图?
#更新
我发现了问题。基本上约束是正确的。
在layoutSubviews被调用后,UIImageView的大小被正确地调整了。宽度和高度与预期相同。 问题在于systemLayoutSizeFittingSize:UILayoutFittingCompressedSize的工作方式。
它不是使用UIImageView大小(已经被正确调整)计算大小,而是使用UIImage的大小(源文件更大)
那么,我该怎么做才能强制systemLayoutSizeFittingSize:UILayoutFittingCompressedSize使用UIImageView大小来计算大小?
2个回答

1
我发现了解决方案。
简单来说,约束条件是正确的,在iOS 8上,systemLayoutSizeFittingSize:UILayoutFittingCompressedSize按预期工作,但在iOS7上不起作用。
纯属巧合,我调用了以下组合:
[self.HeaderView setNeedsLayout];
[self.HeaderView layoutIfNeeded];

我发现,重复调用此组合可以让 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize 在 iOS 7 上正常工作(不必在 iOS 8 上使用)。
那时,我意识到解决方法是连续两次调用上述组合。 很想了解原因......

-1
这是我的做法:我为表头视图创建约束,使其左右等于tableView,并将优先级设置为UILayoutPriorityDefaultHigh。当表头视图在didMoveToWindow中移动到非nil窗口时,我将这些约束添加到tableView中,在willMoveToSuperview中从其父视图中删除它们。一旦设置完成,我使用systemLayoutSizeFittingSize但传入self.frame,然后将其设置为tableHeaderView。
这似乎很好地工作,包括旋转。添加/删除约束的顺序非常重要,以避免UILayout发出警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接