删除和插入具有不同高度的单元格时,UITableView 动画故障

标签 uitableview

我在同时删除和插入单元格时遇到 UITableView 提供的动画问题。
我有一个单元格列表,可以称它们为问题。当一个问题被点击时,它应该在其下方添加一个单元格以显示该问题的答案。如果已显示另一个答案,则应从表中删除该答案。
当插入的单元非常高时,就会出现问题。如果它太高以至于最终边界侵占了要删除的单元格占用的空间,那么在动画期间,我们会看到我们正在删除的答案单元格以查看正在添加的单元格

(see link to video of problem)

这就是我的代码在表格 View 中的单元格周围移动的样子

[tableView beginUpdates];

if (deleteIndex) {
    [tableView deleteRowsAtIndexPaths:@[deleteIndex] withRowAnimation:UITableViewRowAnimationTop];
}
if (addIndex) {
[tableView insertRowsAtIndexPaths:@[addIndex] withRowAnimation:UITableViewRowAnimationTop];
}

[tableView endUpdates];

我试过了
[tableView beginUpdates];

if (deleteIndex) {
    [tableView deleteRowsAtIndexPaths:@[deleteIndex] withRowAnimation:UITableViewRowAnimationTop];
}
[tableView endUpdates];

//do stuff to update data source

[tableView beginUpdates];

if (addIndex) {
[tableView insertRowsAtIndexPaths:@[addIndex] withRowAnimation:UITableViewRowAnimationTop];
}

[tableView endUpdates];

但是因为在开始第二个 block 之前没有确认 TableView 确实完成了第一个集合更新的回调,所以几乎会出现相同的问题。我知道我可以使用延迟执行选择器,但这似乎是一个创可贴。

其次,我试图将动画包含在这样的 block 中
[UIView animateWithDuration:0.0 animations:^{
    [tableView beginUpdates];

    if (deleteIndex) {
        [tableView deleteRowsAtIndexPaths:@[deleteIndex] withRowAnimation:UITableViewRowAnimationTop];
    }
    [tableView endUpdates];

    //do stuff to update data source

} completion:^(BOOL finished) {

    [tableView beginUpdates];

    if (addIndex) {
        [tableView insertRowsAtIndexPaths:@[addIndex] withRowAnimation:UITableViewRowAnimationTop];
    }

    [tableView endUpdates];
}];

同样,因为完成 block 是在我们调用 endUpdates 之后而不是在更新实际完成之后触发的,所以这并不能解决使用问题。

我还进入了 Storyboard,以确保为单元格选择了剪辑 subview 到边界。同样,这并不能解决问题,因为我们没有看到单元格的 subview 扩展超出其预期高度。

通过放慢动画来仔细观察动画,看起来苹果将要添加的单元格插入到表格中不会更改的单元格下方,然后将保留的单元格移动到新位置。结果,被删除的单元格变成了一个透明的窗口,我们可以在其中看到他们实际上在做什么。

最佳答案

正确的方法是首先删除旧答案,然后在动画结束后添加新答案。单元格动画完成后触发的 UITableViewDelegate 方法。

tableView:didEndDisplayingCell:forRowAtIndexPath:

在此委托(delegate)方法中插入新的答案行将产生正确的动画。

有一些细节需要牢记——您需要一些逻辑来确保返回正确的单元格高度并返回该部分中正确的预期行数。这些数据源方法在我们删除旧答案后调用,当我们调用时添加新答案时再次调用
endUpdates

在 TableView 上

使用 UITableViewRowAnimationTop 以外的任何东西都会导致一些奇怪的动画行为。这是因为单元格的内容 View 不是动画。

关于删除和插入具有不同高度的单元格时,UITableView 动画故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14492335/

相关文章:

ios - 如何在 UITableView 滚动时缩小 UIImageView 内容(图像)?

ios - 在 UITableViewCell 中隐藏按钮

ios - 使用 'YoutubePlayer Swift SDK' 在 tableviewCell 中播放 youtube 视频

ios - 如何从表格单元格中删除 UIGestureRecognizer

ios - ScrollsToTop 功能在 iOS9 中无法正常工作

ios - 两 ListView ?

objective-c - 从 Xib 设置 UISearchBar 不显示 iOS 5 上的搜索栏

ios - 如何回收从 XIB 创建的 UITableViewCell 对象?

ios - 在 ViewController 中向 UITableView 添加数据/行。 swift

swift - 更改 UITableViewCell 中 imageView 的位置