当我通过右键滑动删除一行时,我正在处理一个有很好动画的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.如何解决这个问题?
答案 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)或者,如果对其他剩余细胞不重要,请不要重新加载表格。