如上所述,在 UITableView 中,标题的高度不是由自动布局控制的,而是由
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
页脚高度由
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
最后单元格高度由
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
表格视图从情节提要、XIB 文件或代码中加载单元格。它使用上述方法来设置页眉、页脚和单元格的框架大小,并调整它们的视图以适应该空间。
重要的是要了解自动布局不会改变这些大小,它只处理用于在其容器内布局视图的规则。
如果您的单元格/页眉/页脚使用静态尺寸,那么这很容易。您只需锁定所有子视图的高度,将您的单元格设置为与您在 heightFor 中返回的大小相同...一切看起来都应该如此。
动态单元格/页眉/页脚需要更多的工作。
本质上,在您实际制作它并调整所有子视图的大小之前,您会被要求告诉表格视图您的单元格/页眉/页脚的大小。
您可以通过在 cellForRowAtIndexPath 和 heightForRowAtIndexPath 方法处设置断点来快速测试这一点,首先调用高度。
对于动态 tableviewcell 高度,一个常见的技巧是在 viewDidLoad 中创建一个单元格并将其保存以计算高度。然后,当您到达 heightForRowAtIndexPath 或 heightForHeaderInSection 时,使用预制单元格输入您将在最终单元格中使用的值,对于 UILabel,使用 sizeWithFont(iOS 7 之前)或 boundingRectWithSize(iOS 7.0+),对于 UITextViews 使用 sizeThatFits。(对于将来阅读本文的任何人,请检查这些方法是否没有被更新的方法取代)
因此,将您想要的文本放入虚拟单元格,获取标签和文本视图的高度,在它们之间添加空格并在完成后返回最终大小。
然后在 cellForRowAtIndexPath 或 headerForSection 中重做值的设置,但在将显示的实际单元格上。
如果您的高度计算与您的自动布局设置相匹配,那么一切都将完美地适合为其设计的空间。
如果您想在绘制后更改单元格或标题的高度,那么您需要通过执行以下操作来更新表格视图:
[self.tableView beginUpdates];
// change the data that will cause cell height to be different in heightForCellAtIndexPath or which will change a header or footer height calculation
[self.tableView endUpdates];
这将导致 tableview 检查它的大小,并且仅在更改时更新单元格或页眉/页脚。