Табличное представление "прыгает", когда я пытаюсь scrollToRow с UITableViewAutomaticDimension. Исправление также заставляет его прыгать

У меня та же проблема, что и у этой. Я попытался реализовать предлагаемое исправление, и вместо того, чтобы просматривать всю таблицу, а затем снова переходить к последнему ряду, я получил небольшие скачки вверх. Мне нужно сделать анимацию более плавной. Можно ли это сделать с UITableViewAutomaticDimension?

Вот GIF, показывающий сломанную анимацию


Мой код, как показано ниже:

@objc fileprivate func addNext() {
  guard rowsCount.value < cellModels.count else { return }

  let lastIndexPath = IndexPath(row: rowsCount.value, section: 0)
  rowsCount.value += 1

  CATransaction.begin()
  CATransaction.setCompletionBlock({ () -> Void in
    self.scrollToLastMessage()
  })

  tableView.update {
    tableView.insertRows(at: [lastIndexPath], with: .none)
  }
  CATransaction.commit()
}

func scrollToLastMessage()
{
  let bottomRow = tableView.numberOfRows(inSection: 0) - 1
  let bottomMessageIndex = IndexPath(row: bottomRow, section: 0)

  guard bottomRow >= 0
    else { return }

  CATransaction.begin()
  CATransaction.setCompletionBlock({ () -> Void in

    self.tableView.scrollToRow(at: bottomMessageIndex, at: .bottom, animated: true)
  })

  let contentOffset = tableView.contentOffset.y
  let newContentOffset = CGPoint(x:0, y:contentOffset + 1)  
  tableView.setContentOffset(newContentOffset, animated: false)

  CATransaction.commit()
}


extension UITableView {
  typealias Updates = () -> Void

  func update(_ updates: Updates) {
    beginUpdates()
    updates()
    endUpdates()
  }
}

Заранее спасибо.

1 ответ

Я решил эту проблему, когда добавил приблизительную высоту строки для моего табличного представления:

var cellHeightsDictionary: [Int:CGFloat] = [:]

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
  cellHeightsDictionary[indexPath.row] = cell.frame.size.height
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  return cellHeightsDictionary[indexPath.row] ?? 44.0
}
Другие вопросы по тегам