tableView.reloadData()结束其他动画,如何解决?

时间:2016-05-17 01:09:24

标签: ios swift uitableview

当我通过右键滑动删除一行时,我正在处理一个有很好动画的todolist:

func toDoItemDeleted(toDoItem: ToDoItem) {
    let index = (toDoItems as NSArray).indexOfObject(toDoItem)
    if index == NSNotFound { return }

    // could removeAtIndex in the loop but keep it here for when indexOfObject works
    toDoItems.removeAtIndex(index)

    // use the UITableView to animate the removal of this row
    tableView.beginUpdates()
    let indexPathForRow = NSIndexPath(forRow: index, inSection: 0)
    tableView.deleteRowsAtIndexPaths([indexPathForRow], withRowAnimation: .Fade)
    tableView.endUpdates()
    // refresh gradient effect of rows
    tableView.reloadData()
}

所以基本上我删除数据,然后使用tableView.deleteRowsAtIndexPaths([indexPathForRow], withRowAnimation: .Fade)制作删除动画,然后我决定修复所有现有行的渐变效果(行的背景颜色,从红色到黄色的底部,删除一行通过调用reloadData()来打破渐变效果。

结果是reloadData()在淡入淡出动画开始之前发生得太快,从而杀死了动画。我的问题是:
1.为什么? 2.如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您需要使用动画块来实现这一目的。试试这个: -

UIView.animateWithDuration(0.3, delay: 0,
            options: [], animations: {
              toDoItems.removeAtIndex(index)
              // use the UITableView to animate the removal of this row
              tableView.beginUpdates()
              let indexPathForRow = NSIndexPath(forRow: index, inSection: 0)
              tableView.deleteRowsAtIndexPaths([indexPathForRow], withRowAnimation: .Fade)
              tableView.endUpdates()
             // refresh gradient effect of rows

            }, completion: { _ in
               tableView.reloadData()
          })

根据需要设置持续时间。(0.3或你想要的)

答案 1 :(得分:0)

我建议您在希望删除的一行上同时调用deleteRowsAtIndexPaths,也可以在所有其他剩余的索引路径上调用reloadRowsAtIndexPaths。

func reloadRowsAtIndexPaths(_ indexPaths: [NSIndexPath],
           withRowAnimation animation: UITableViewRowAnimation)

这样做的目的是为所有剩余的索引路径提供UITableView的数据源请求cellForRowAtIndexPath。

很酷的东西。

答案 2 :(得分:0)

答案很简单 - 您正在删除带有动画的行,这需要时间,通常大约0.3秒,但是,调用reloadData强制表立即重绘其内容,这会停止未完成动画。你可以

1)等待半秒钟,用dispatch_after或类似的东西重新加载你的桌子;

2)从数据源中删除相应的数据,并使用reloadSections: withRowAnimation:使用动画重新加载表格的部分,而无需手动删除单元格;

3)或者,如果对其他剩余细胞不重要,请不要重新加载表格。