UITableView无法正确设置屏幕重新排序的单元格

时间:2018-05-19 11:39:43

标签: ios swift xcode uitableview nsfetchedresultscontroller

我正在为我的数据源使用NSFetchedResultsController。

当我对一个单元格进行重新排序并且它向上或向下移动到屏幕上或稍微偏离屏幕的位置时,单元格会以动画的形式移动到它的新位置。

但是,当行移动到屏幕外的新位置时,它会在没有任何动画的情况下移动。

理想情况下,我希望这些情况下的行能够向下或向上动画,直到它关闭屏幕。有没有办法在不实现自定义方法的情况下实现这一目标?

我在这里使用的案例是以下委托调用中的.move:

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case .insert:
        tableView.insertRows(at: [newIndexPath!], with: UITableViewRowAnimation.none)
    case .delete:
        tableView.deleteRows(at: [indexPath!], with: UITableViewRowAnimation.none)
    case .update:
        tableView.reloadRows(at: [indexPath!], with: UITableViewRowAnimation.none)
    case .move:
        tableView.moveRow(at: indexPath!, to: newIndexPath!)
    }

}

1 个答案:

答案 0 :(得分:1)

docsUIKit将为所有单元格设置动画移动操作,但是它发生的速度太快,以至于它不是非常直观。

因此,您可以使用move(at:,to:)进行两次performBatchUpdates来电,实际获得所需效果,如下所示:

guard indexPath != newIndexPath, let paths = tableView.indexPathsForVisibleRows else { return }
if paths.contains(newIndexPath!) {
    tableView.moveRow(at: indexPath!, to: newIndexPath!)
} else {
    tableView.performBatchUpdates({
        let index = indexPath < newIndexPath ? (paths.count - 1) : 2
        tableView.moveRow(at:indexPath!, to: paths[index])
        tableView.moveRow(at: paths[index], to: newIndexPath!)
    })
}

请注意,要实现向上滚动动画,您必须将paths索引设置为2作为向上移动的中点。