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

видео ошибки анимации tableview

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

Начиная с 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()
}

Ответ 1

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

Установите estimatedRowHeight, estimatedSectionHeaderHeight и estimatedSectionFooterHeight в 0.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

        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()

Ответ 4

Я исправил его, используя этот код:

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

Ответ 5

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

tableView.estimatedRowHeight = 1000