SnapSh0t
@SnapSh0t
iOS-Developer

Как исправить прыгающие ячейки в TableView?

Здравствуйте!

Есть одна проблема, которую я все никак не могу решить, а именно - бьюсь с плавной анимацией добавления новых ячеек в таблицу (tableView.insertRows). На видео ниже видно как при открытии все ячейки дико дергаются, прилагаю код:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if (destinationData?[indexPath.row]) != nil {
            if(indexPath.row + 1 >= (destinationData?.count)!) {
                expandCell(tableView: tableView, index: indexPath.row)
            }
            else {
                if(destinationData?[indexPath.row+1] != nil) {
                    expandCell(tableView: tableView, index: indexPath.row)
                    // Close Cell (remove ExpansionCells)
                } else {
                    contractCell(tableView: tableView, index: indexPath.row)
                }
            }
        }
    }

    private func expandCell(tableView: UITableView, index: Int) {
        if let infoMain = destinationData?[index]?.infoMain {
            for i in 1...infoMain.count {
                destinationData?.insert(nil, at: index + 1)
                tableView.insertRows(at: [IndexPath(row: index + i, section: 0)] , with: .bottom)
            }
        }
    }
    
    private func contractCell(tableView: UITableView, index: Int) {
        if let infoMain = destinationData?[index]?.infoMain {
            for _ in 1...infoMain.count {
                destinationData?.remove(at: index + 1)
                tableView.deleteRows(at: [IndexPath(row: index + 1, section: 0)], with: .top)
            }
        }
    }




Перепробовал все что уже мог и посерфил инет, решение проблемы найти не смог, прошу подсказать как можно исправить подобное.
  • Вопрос задан
  • 337 просмотров
Пригласить эксперта
Ответы на вопрос 2
@andrew8712
Оберните содержимое expandCell и contractCell в вызовы tableView.beginUpdate() и tableView.endUpdate()
И лучше конечно вызывать tableView.insertRows.... один раз, а не каждую итерацию. Советую сначала построить массив индексов, и с ними уже вызывать этот метод
Ответ написан
@iMaximus
Мне лень писать код, но есть же метод tableView.insertRows(at: IndexSet(integer: tableview.numberOfRows), withAnimation: .effectFade)
Да и роликов полно на эту тему https://www.youtube.com/watch?v=whbyVPFFh4M
https://www.youtube.com/watch?v=xhPDQ-I8Hf8
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы