如何在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;
只是一个想法。