过去的三四个小时里,我一直用这个把头撞在墙上,但我似乎想不明白。我有一个 UIViewController,里面有一个全屏的 UITableView (屏幕上还有其他一些东西,这就是为什么我不能使用 UITableViewController) ,我想让我的 tableHeaderView 自动调整大小。不用说,这不是合作。
见下面的截图。
因为 overviewLabel (例如“列表概述信息在这里。”(text)有动态内容,我使用自动布局来调整它的大小和它的视图。我已经很好地调整了所有内容的大小,除了 tableHeaderView,它位于层次结构中视差表视图的正下方。
我找到的调整头部视图大小的唯一方法是通过编程方式,代码如下:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
在本例中,headerFrameHeight 是对 tableViewHeader 高度的手动计算,如下所示 (innerHeaderView 是白色区域,或者第二个“视图”,headerView 是 tableHeaderView):
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
手工计算是可行的,但是如果将来情况发生变化,它就会变得笨拙并且容易出错。我希望能够让 tableHeaderView 根据提供的约束自动调整大小,就像在其他任何地方一样。但我怎么也想不明白。
关于这个问题有几篇文章,但是没有一篇是清楚的,最后让我更加困惑:
将 translatesAutoresizingMaskIntoConstraint 属性更改为 NO 实际上没有意义,因为这只会导致错误,而且在概念上也没有意义。
如果你能帮忙,我会很感激的!
编辑1: 多亏汤姆斯威夫特的建议,我终于弄明白了。不需要手动计算概述的高度,我可以按照以下方式计算它,然后像前面一样重新设置 tableHeaderView。
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Edit 2: 正如其他人所指出的,Edit 1中发布的解决方案似乎不能在 viewDidLoad 中工作。但是,它似乎在 viewWillLayoutSubviews 中工作。下面的示例代码:
// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[_headerWrapper setNeedsLayout];
[_headerWrapper layoutIfNeeded];
CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = _headerWrapper.frame;
headerFrame.size.height = height;
_headerWrapper.frame = headerFrame;
_tableView.tableHeaderView = _headerWrapper;
}