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

Posted

技术标签:

【中文标题】如何在 UITableView 中为节标题的高度变化设置动画?【英文标题】:How to animate the height change of an section header in UITableView? 【发布时间】:2010-04-17 18:01:50 【问题描述】:

我已经实现了这个方法来返回节标题的高度。但是,当部分的高度发生变化时,它会立即发生而没有动画。

有动画吗?

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

【问题讨论】:

【参考方案1】:

我不能 100% 确定这是否适用于表格标题,但它适用于表格行,因此值得一试。我有一个实例变量 headerHeight 最初设置为 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;

【讨论】:

感谢@prendio2 运行良好。但是它无法删除视图(这是我试图做的)。但是一旦我滚动它就被删除了,所以没关系:) 对于任何与我有相同用例的人(他们想删除视图),您可以保留对它的引用并在动画期间对其使用 removeFromSuperview 方法以正确隐藏它. 这很好用,但是弹出的区域覆盖了我的第一个 UITableViewCell。有任何想法吗?发生这种情况时有什么办法可以将 tableView 向下移动? 这对我有用,只是它没有遵循我用[UIView beginAnimations:context:]设置的动画持续时间 伙计们,把这个方法放在哪里(changeHeight:)。当出现标题时,我需要自动动画。怎么称呼?【参考方案2】:

这行得通:

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];

【讨论】:

【参考方案3】:

我在 Swift 中的解决方案:

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()
         )
    

【讨论】:

【参考方案4】:

我尚未对此进行测试,但有时当我的 UITableViewCells 更改高度时会出现不需要的动画。造成这种情况的原因是我绘制了自己的单元格,并且我使用 CALayers 来这样做。在单元格的(void)layoutSubviews 中,我会将 CALayer 的大小更改为单元格框架的大小

myLayer.frame = self.bounds;

当 CALayer 的 frame/bounds 属性发生变化时,它会被动画化。所以理论上,我会说你可以使用 tableView:viewForHeaderInSection: 方法,它可以让你绘制自己的节标题。您可以只返回一个实现 (void)layoutSubviews 的 UIView,然后在该方法中执行

self.layer.frame = self.bounds;

只是一个想法。

【讨论】:

以上是关于如何在 UITableView 中为节标题的高度变化设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView中的UICollectionView。如何在集合视图变高时告诉tableview单元格改变高度?

如何获取在情节提要中为 tableView 静态单元格设置的预设高度?

在 UITableViewCell 中为 UITableView 设置动画

如何从核心数据中获取父实体的所有子实体,以及如何将父数据用作 UITableview

当单元格高度为动态时设置 UITableView 的高度

UITableView 在 iOS8 中为某些单元格显示错误位置的分隔符