Я строю табличное представление с автоматически изменяющимися ячейками, поэтому я возвращаю UITableView.automaticDimension
в качестве высоты ячеек. Теперь я удаляю ячейку, используя:
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .left)
tableView.endUpdates()
Повторяющаяся анимация часто сбивается. Позвольте мне описать то, что я пробовал до сих пор и результаты. Мне не нужно заботиться о невидимых ячейках, поскольку анимация будет воспроизводиться только для видимых ячеек, поэтому я буду говорить только об этом. Кроме того, у меня нет верхнего / нижнего колонтитула.
Подход 1: Использование предполагаемой высоты
Это был мой первый подход - я просто вернул фактическую оценку для предполагаемой ячейкивысота. Это будет работать, если ячейка либо полностью на экране, либо частично видна внизу экрана. Если он частично находится за пределами экрана в верхней части экрана, анимация будет отображаться либо без анимации (поэтому весь контент скачет), либо анимированная ячейка внезапно сдвигается вниз, чтобы она полностью выглядела на экране, и затем анимация воспроизводится. Я также видел, как происходили другие глючные вещи, но большую часть времени это один из тех двух.
Подход 2: Использование автоматической расчетной высоты
Так что я подозреваю, что это из-зарасчетная высота ячеек. Когда вызывается код удаления, iOS начинает запрашивать приблизительную высоту для всех ячеек. Поэтому мой следующий подход - использовать UITableView.automaticDimension
как для оценки, так и для реальной высоты ячейки, и посмотреть, будет ли это что-то делать. Изменений не так много, за исключением того, что ячейка, перемещаемая вниз, как в подходе 1, больше не происходит. Вместо этого никакая анимация не будет воспроизводиться каждый раз, когда ячейки не полностью отображаются на экране в верхней части экрана.
Подход 3: Использование фактической высоты ячейки в качестве расчетной высоты
При исследовании этого я читалиногда о людях, строящих «кэши высоты» для хранения высот ячеек и возвращающих их в estimatedHeightForCell
. Я так и сделал, но оказалось, что на самом деле это ничего не меняет по сравнению с подходом 2.