2

我希望能够扩展/收缩 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 在重新加载期间不会保持静止。

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

4

2 回答 2

2

尝试更换

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

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

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

于 2013-08-22T02:19:40.417 回答
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你可以调查一下,但我不确定是否可以改变高度)

于 2013-08-22T01:07:10.860 回答