在为 `tableHeaderView` 设置动画时为 `UITableView` 标头设置动画

Posted

技术标签:

【中文标题】在为 `tableHeaderView` 设置动画时为 `UITableView` 标头设置动画【英文标题】:Animate `UITableView` headers when animating `tableHeaderView` in 【发布时间】:2013-03-15 12:42:01 【问题描述】:

对于“How to resize a tableHeaderView of a UITableView?”的答案,我在github 上创建了一个小项目,它为UITableView 添加了标题视图,并为新添加的标题视图及其下方的单元格设置了动画。

但是,当我添加标题单元格时,我会遇到令人讨厌的 UI 故障,因为标题不会与 UITableView 的单元格一起动画:

当我添加标题时,会发生以下步骤:

    问题:最上面的header跳转到原来的位置 tableHeaderViewUITableViewCells 一起动画到它们的最终位置。

所以我的问题是,如何确保标题也有动画效果。

您可以在这里看到效果,Section-1 位于最终位置,而单元格和标题视图仍在动画中:

这是我做动画的方法:

- (void) showHeader:(BOOL)show animated:(BOOL)animated

    CGRect closedFrame = CGRectMake(0, 0, self.view.frame.size.width, 0);
    CGRect newFrame = show?self.initialFrame:closedFrame;

    if(animated)
        // The UIView animation block handles the animation of our header view
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        // beginUpdates and endUpdates trigger the animation of our cells
        [self.tableView beginUpdates];
    

    self.headerView.frame = newFrame;
    [self.tableView setTableHeaderView:self.headerView];

    if(animated)
        [self.tableView endUpdates];
        [UIView commitAnimations];
    

【问题讨论】:

将表格视图样式更改为分组并验证。它可能会解决问题。 @Dee 这并不能解决我的问题,因为我需要浮动表视图标题 通过实现您的动画标题然后遇到完全相同的问题找到了这个问题。我也在寻找修复,但没有太多想法。 我的意思是可复制的,有什么方法可以编辑赏金消息吗? 【参考方案1】:

这将解决它,但我不确定您是否需要在本课程的另一部分中使用 beginUpdatesendUpdates。因为你的dataSource 在这个例子中并没有真正改变。

- (void)showHeader:(BOOL)show animated:(BOOL)animated 

    CGRect closedFrame = CGRectMake(0, 0, self.view.frame.size.width, 0);
    CGRect newFrame = show?self.initialFrame:closedFrame;

    if(animated)
        // The UIView animation block handles the animation of our header view
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        // beginUpdates and endUpdates trigger the animation of our cells
        //[self.tableView beginUpdates];
    

    self.headerView.frame = newFrame;
    [self.tableView setTableHeaderView:self.headerView];

    if(animated)
        //[self.tableView endUpdates];
        [UIView commitAnimations];
    

【讨论】:

这确实解决了添加 tableview.tableheader 的问题,但是当您删除 tableview 标题时,原始问题仍然存在。 好的,我在原始项目上进行了验证,这确实完全解决了问题。我现在正在研究为什么我实施的解决方案仅在显示标题时有效,而在隐藏时无效。 如果您正在做更多的事情,例如更新/添加单元格,您可以尝试将beginUpdates/endUpdates 移出此viewAnimation。完全没有动画或不同的动画块。也许这会有所帮助;) 很奇怪。我没有做任何我能看到的事情。我在表格视图之间看到的唯一区别是我的有一个自定义部分标题视图。而且,项目表视图是静态表视图,而我的是动态表视图。 这对我不起作用....它为表格视图设置动画,但标题只是出现在顶部。我在我的自定义表头视图上使用布局约束,如果这可能会影响任何事情。

以上是关于在为 `tableHeaderView` 设置动画时为 `UITableView` 标头设置动画的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画

TabView 在为 SwiftUI 设置动画的选项卡之间切换

在使用 AVAudioRecorder 在为导航栏设置动画的同时录制音频时发生中断时,我们如何停止并保存录制?

如何防止行动画向下滚动 TableHeaderView?

UISearchBar 未设置为 UITableView.tableHeaderView

UITableView - 直接设置 tableHeaderView 属性与实现 -viewForHeaderInSection 方法