Проблема с вашим estimatedHeightForRowAt
методом. Как следует из названия, он дает приблизительную высоту таблицы, чтобы иметь представление о прокручиваемом контенте до тех пор, пока не отобразится фактический контент. Более точное значение приведет к более плавной прокрутке и оценке высоты.
Вы должны установить это значение на достаточно большое, чтобы оно могло представлять высоту вашей ячейки с максимальным содержанием. В вашем случае 650 работает нормально.
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 650
}
Результат был бы намного лучше при таком подходе.
Кроме того, нет необходимости реализовывать метод делегата для высоты, пока вы не захотите вариации на основе индексов. Вы можете просто установить свойство представления таблицы.
tableView.estimatedRowHeight = 650.0
tableView.rowHeight = .automaticDimension
Оптимизация
Еще одна вещь, которую я заметил в вашем демо-проекте. Вы использовали слишком много if-else
в своем cellForRowAtIndexPath
, что делает его немного медленнее. Попробуйте минимизировать это. Я сделал некоторые уточнения, и это улучшает производительность.
Определите массив, содержащий текст вашего сообщения.
var messages = ["Lorem ipsum,"many more",.....]
Замените ваш cellForRowAt indexPath
следующим:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell : WorldMessageCell
cell = tableView.dequeueReusableCell(withIdentifier: "WorldMessageCell", for: indexPath) as! WorldMessageCell
if indexPath.row < 14 {
cell.messageLabel.text = messages[indexPath.row]
}
else if indexPath.row >= 14 && indexPath.row != 27 {
cell.messageLabel.text = messages[14]
}
else if indexPath.row == 27 {
cell.messageLabel.text = messages.last
}
return cell
}