【发布时间】:2014-01-25 18:44:14
【问题描述】:
在过去的 3 或 4 个小时里,我一直把头撞在墙上,我似乎无法弄清楚。我有一个 UIViewController,里面有一个全屏 UITableView(屏幕上还有一些其他的东西,这就是我不能使用 UITableViewController 的原因),我想让我的 tableHeaderView 使用自动布局调整大小。不用说,它不合作。
请看下面的截图。
因为overviewLabel(例如“在此处列出概述信息。”文本)具有动态内容,我正在使用自动布局来调整它的大小并且它是超级视图。我已经很好地调整了所有内容,除了 tableHeaderView,它位于层次结构中 Paralax Table View 的正下方。
我发现调整标题视图大小的唯一方法是以编程方式使用以下代码:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
这里headerFrameHeight是手动计算tableViewHeader高度如下(innerHeaderView是白色区域,或者第二个“View”,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 根据提供的约束自动调整大小,就像在其他任何地方一样。但是对于我的生活,我无法弄清楚。
关于这个有几篇关于这个的帖子,但没有一个是清楚的,最终让我更加困惑。这里有一些:
Is it possible to use AutoLayout with UITableView's tableHeaderView?
table header view height is wrong when using auto layout, IB, and font sizes
将 translatesAutoresizingMaskIntoConstraints 属性更改为 NO 并没有什么意义,因为这只会导致错误,而且在概念上也没有任何意义。
任何帮助将不胜感激!
编辑 1: 感谢 TomSwift 的建议,我能够弄清楚。无需手动计算概览的高度,我可以按如下方式为我计算它,然后像以前一样重新设置 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];
编辑 2: 正如其他人所指出的,编辑 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;
}
【问题讨论】:
-
setTableHeaderView在 Xcode6 上不起作用。问题是单元格与 tableHeaderView 重叠。但是,它适用于 Xcode5 -
@DawnSong 知道 Xcode6 的解决方案,以便我可以更新答案?
-
经过大量试用,我使用UITableViewCell代替tableHeaderView,它可以工作。
-
我的头也砸了!
-
真正完整的自动布局解决方案是here
标签: ios ios7 autolayout uitableview