iOS 11 UITableView ошибка анимации удаления строк

видео об ошибке анимации просмотра таблицы

У меня есть табличное представление, которое расширяет / сворачивает свои ячейки.

Начиная с iOS 11, tableView начинает вести себя странно при вставке и удалении строк. ContentSize изменился до того, как произошел блок анимации, и, следовательно, в видео вы можете увидеть глючную прокрутку, происходящую на сворачивающихся ячейках. Анимация выглядит просто неправильно.

Этот код отлично работал на iOS 10. Кто-нибудь знает, что изменилось на стороне Apple? Это известная проблема?

public func insertingRowsForAccordion(_ indexArray: [IndexPath], selectedRowIndex: Int) {
    beginUpdates()
    insertRows(at: indexArray, with: UITableViewRowAnimation.fade)
    endUpdates()

 // Scroll to selection after expanding children
    scrollToRow(at: IndexPath(row: selectedRowIndex, section: 0), at: UITableViewScrollPosition.top, animated: true)
}

public func removeRowsForAccordion(_ indexArray: [IndexPath]) {
    beginUpdates()
    deleteRows(at: indexArray, with: UITableViewRowAnimation.fade)
    endUpdates()
}

4 ответа

Решение

У меня были многочисленные проблемы с iOS 11 UITableView, Идя к каждому UITableView во всем моем приложении и выполнение следующих исправило все мои проблемы.

Задавать estimatedRowHeight, estimatedSectionHeaderHeight, а также estimatedSectionFooterHeight до 0.

Источник: iOS 11 Плавающий заголовок TableView

В iOS 11.2 у меня была плохая анимация после удаления строки с использованием стандартных действий строки. Мне удалось только улучшить ситуацию, поместив удаление строк и отклонение действий строк в транзакцию CAT.

Сначала я отклоняю действия со строками и жду завершения анимации, а затем удаляю строку из табличного представления.

По крайней мере, он больше не перемещается вокруг смещения содержимого табличных представлений, но это длинная двухэтапная анимация. Я все еще ищу лучшее решение.

        CATransaction.begin()
        CATransaction.setCompletionBlock({
            self.tableView.beginUpdates()
            self.myViewModel?.items?.remove(at: indexPath.row)
            self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.top)
            self.tableView.endUpdates()
        })
        self.tableView.setEditing(false, animated: true)
        CATransaction.commit()

У меня была похожая проблема с анимацией удаления строк таблицы на iOS 11, иногда странная прокрутка ячеек таблицы (iOS 10 работала просто отлично). Что помогло, так это реализация метода делегата, возвращающего высоту строки:

- (CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

После этого iOS 10 и 11 работают просто отлично.

Я исправил это с помощью этого кода:

self.tableView.beginUpdates()
// ...
self.tableView.endUpdates()
self.tableView.layer.removeAllAnimations()

Частичное исправление, которое у меня работает, устанавливает estimatedRowHeightк большому количеству.

tableView.estimatedRowHeight = 1000
Другие вопросы по тегам