UITableView не правильно анимирует ячейки, которые переупорядочены за пределами экрана - PullRequest
0 голосов
/ 19 мая 2018

Я использую 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 голосов
/ 19 мая 2018

Из документов , UIKit будет анимировать операции перемещения для всех ячеек, однако это происходит настолько быстро, что это не очень визуально.

Таким образом, вы можете получить желаемоеэффект от двух 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 в качестве средней точки для движения вверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...