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