在保持滚动位置的同时,动画高度更改所有UITableViewCells

时间:2013-08-22 00:59:45

标签: ios animation uitableview tableview

我希望能够扩展/收缩UITableView中的所有单元格,同时保持当前位置并使更改为高度变化设置动画。基本上它应该看起来像视图中的当前单元格正在扩展/收缩,并且滚动位置保持不变。

我能够通过具有不同高度的2个状态并调用

来扩展/联系单元格
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

我试图保持相同的位置(不是100%这个计算是正确的):

        //calculate the new position it should scroll to based on new cell height
        CGFloat posFromTop = self.tableView.contentOffset.y;
        CGFloat newDistance = 0;

            if(expandedState)
            {
                CGFloat cellsFromTop = posFromTop / kExpandedCellHeight;
                newDistance = cellsFromTop * kCollapsedCellHeight;
            }
            else
            {
                CGFloat cellsFromTop = posFromTop / kMGLCollapsedCellHeight;
                newDistance = cellsFromTop * kMGLExpandedCellHeight;
            }
        }

//reload section
        [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:YES];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

虽然这似乎有点工作,但它不会保持位置,因为它动画,它闪烁白色,所以它不稳定,并且看起来不像tableView在重新加载期间保持静止。

任何人都有一种方法可以在保持相同位置的同时平滑地动画所有单元格的高度吗?

2 个答案:

答案 0 :(得分:2)

尝试替换

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation: UITableViewRowAnimationAutomatic];

[self.tableView beginUpdates];
[self.tableView endUpdates];

后者将获取当前单元格并更新其大小。使用自动动画重新加载这些部分可能会使用淡入淡出动画,它会在新高度生成新单元格,并在现有单元格和新现有单元格之间淡入淡出,这可能不是您想要的。

答案 1 :(得分:0)

你可能会发现执行第一个崩溃动画需要多少时间,让我们说它需要1秒钟。然后我想你会说出这样的话:

[UIView animateWithDuration:1.0 animations:^{
    [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO];
}]; 

这将执行超过1秒的动画,其中tableView从当前contentOffset开始,最终得到您想要的contentOffset。我从来没有使用UITableViewRowAnimationAutomatic或者动画用于tableView,但也许你可以尝试其他一些值。

实际上,如果您知道我的意思,您可以将这些动作放入同一动画中。这也可以让你控制一切的持续时间。我不知道这是否有效,我现在无法测试,但看起来像这样:

[UIView animateWithDuration:1.0 animations:^{
    [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO];
    [self.tableView setRowHeight:newHeight];
}]; 

我怀疑这个特定的方法确实存在,但我确信你会得到我正在谈论的内容,如果那里有类似的东西会发现它。甚至可能在原始调用中使用nil作为动画参数。

(还有一些名为beginUpdatesendUpdates的东西,如果这不起作用你可以查看,但我不确定是否可以改变高度)