如何在UITableView中设置节标题的高度变化?

我已经实现了这个方法来返回节头高度。 但是,当节的高度发生变化时,会立即发生animation。

有animation吗?

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (flatHeader) { return 50.0f; } else { return 100.0f; } } 

我不是100%确定这将工作表表头,但它适用于表行,所以这是值得一试。 我有一个实例variablesheaderHeight最初设置为44.0,我改变它如此:

 - (void)changeHeight { [self.tableView beginUpdates]; headerHeight = 88.0; [self.tableView endUpdates]; } 

在我的代码中,我在heightForRowAtIndexPath返回headerHeight ,但您可以在heightForHeaderInSection尝试:

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return headerHeight; } 

这工作:

 flatHeader = YES; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; [[self tableView] beginUpdates]; [[self tableView] endUpdates]; CGRect frame = [[self headerView] frame]; frame.size.height = [self tableView:[self tableView] heightForHeaderInSection:0]; [[self headerView] setFrame:frame]; [UIView commitAnimations]; 

我在Swift中的解决scheme:

 class MyTableViewController: UITableViewController { var sectionHeaderView:UIView? 

 override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { sectionHeaderView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30)) sectionHeaderView?.backgroundColor = UIColor.grayColor() var button = UIButton(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30)) button.backgroundColor = UIColor.darkGrayColor() button.setTitle("collapse/expand", forState: .Normal) button.addTarget(self, action: "collapseOrExpandSectionHeader", forControlEvents: .TouchUpInside) sectionHeaderView?.addSubview(button) return sectionHeaderView } 

 override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if let sectionHeader = sectionHeaderView { return view.frame.size.height } else { return 30.0 } } 

 func collapseOrExpandSectionHeader() { if let sectionHeader = sectionHeaderView { let headerHeight:CGFloat if sectionHeader.frame.size.height == 200 { headerHeight = 30.0 } else { headerHeight = 200.0 } UIView.animateWithDuration(0.3, animations: { self.tableView?.beginUpdates() sectionHeader.frame.size.height = headerHeight self.tableView?.endUpdates() } ) } } 

我没有testing过这个,但是当我的UITableViewCells改变高度的时候,有时我会得到不需要的animation。 原因是我绘制自己的细胞,我使用CALayers来做。 在单元格的(void)layoutSubviews我会将CALayer的大小更改为单元格的大小

 myLayer.frame = self.bounds; 

当CALayer的frame / bounds属性发生变化时,就会生成animation。 所以在理论上,我会说,你可以使用方法tableView:viewForHeaderInSection:这将允许您绘制自己的节标题。 你可以返回一个实现(void)layoutSubviews的UIView,然后在那个方法中做

 self.layer.frame = self.bounds; 

只是一个想法。