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

Как я могу прокрутить представление таблицы вниз до использования динамической высоты ячейки?

По какой-то причине этот код не работает в этом сценарии:

[self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES]; 

Благодаря!

EDIT : используйте код @ Hasiya для прокрутки донизу, для некоторых из вас это может сделать трюк.

4 Solutions collect form web for “Отображение таблицы прокрутки вниз при использовании динамической высоты ячейки”

Следующее работало на мой код Swift 3.1 с использованием Xcode 8.3.2, ориентированного на iOS 10.1 только для iPhone.

У меня была та же проблема, что и у ОП. Мое приложение включало функцию обмена сообщениями. Я хотел, чтобы последнее сообщение было видимым, когда представление сообщения было перенесено в стек. Высокие высоты ячеек таблицы изменяются из-за содержания сообщений. Ни одно из решений не удовлетворило меня (последняя строка таблицы была не видна или только частично видима). Но вот то, что сработало для меня:

  • В построителе интерфейса (IB) установите высоту строки ячейки в значение больше, чем я ожидал, что моя средняя высота строки будет в моем случае 50 (обязательно установите флажок «Пользовательский»).
  • В ViewController, где представление таблицы реализовано внутри функции viewDidLoad, установите свойство rowHeight tableview следующим образом:

     myTableView.rowHeight = UITableViewAutomaticDimension 
  • Также в функции 'viewDidLoad' задано значение 'ratedRowHeight' tableview для значения выше, чем вы ожидаете, что средняя высота строки будет. В моем случае 140.

Наконец, и самое главное, я написал этот бит кода:

 extension UITableView { func scrollToBottom() { let rows = self.numberOfRows(inSection: 0) let indexPath = IndexPath(row: rows - 1, section: 0) self.scrollToRow(at: indexPath, at: .top, animated: true) } } 

Обратите внимание at: .top – это то, что решило мою проблему. Передача значения .bottom для параметра UITableViewScrollPosition просто не работала. Даже прохождение .middle работало – но не .bottom .

Таким образом, в любое время, когда мой набор данных необходимо обновить или поступит новое сообщение, я звоню

 func getTableViewData(){ // Get your data here any way you usually do.. // call to reload myTableView.reloadData() // call the scroll function myTableView.scrollToBottom() } 

Я проверил результаты этого «метода», просто изменив параметр at: .bottom at: .top . Каждый раз, когда я менял его at: .top последние строки таблицы были полностью видимы, а таблица прокручивалась до конца.

В конце концов, я нашел ответ . Причина, по которой прокрутка к нижней части не работает (и вставка / удаление строк также ошибочна, как я узнал позже), заключается в том, что высота ячейки not properly estimated . Чтобы обойти это, попробуйте вернуть близкие оценки в estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath . Однако, если вы не можете этого сделать (и в большинстве случаев вы не сможете), все еще существует отличное решение: Храните высоты ячеек в словаре и возвращайте их для estimatedHeight когда ячейки повторно используются ( например, просмотр таблицы прокручивается). Я нашел это решение в другом вопросе, поэтому, пожалуйста, пойдите и проверьте это на предмет фактического кода о том, как вы это выполнили. (хотя, вероятно, многие из вас могут написать это для себя)

Исходное решение от @dosdos

РЕДАКТИРОВАТЬ: Возможно, исправление просто прокрутки на дно это не нужно, как бы настоятельно не рекомендовано, на мой взгляд. Если вы не используете это для оценки высоты строки, вы столкнетесь с другими проблемами, такими как прокрутка с ошибкой и худшая производительность в большом количестве ячеек.

Также вам нужно добавить это в viewDidAppear

 let lastItem = IndexPath(item: dataSource.count - 1, section: 0) tableView.scrollToRow(at: lastItem, at: .bottom, animated: true) 

Надеюсь, это может сработать для вас. Попробуй это

 [self.tableview setContentOffset:CGPointMake(0, CGFLOAT_MAX)] 

Или

 if (self.tableview.contentSize.height > self.tableview.frame.size.height) { CGPoint offset = CGPointMake(0, self.tableview.contentSize.height - self.tableview.frame.size.height); [self.tableview setContentOffset:offset animated:YES]; } 

Попробуйте использовать scrollToRowAtIndexPath, как указано в приведенном ниже коде.

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSInteger no = array.count-1; NSIndexPath *lastIndex = [NSIndexPath indexPathForRow:no inSection:0]; [self.tableView scrollToRowAtIndexPath:lastIndex atScrollPosition:UITableViewScrollPositionBottom animated:YES]; } 
  • Ошибка приложения в iOS10 после обновления Xcode 8, ошибка malloc
  • Xcode аварийный репортер и биткод
  • UIScrollview с размером содержимого Autolayout в ландшафте
  • Симулятор iOS ничего не отображает
  • Ошибка вызова сценария оболочки с помощью Crashlytics Xcode 8
  • Можете ли вы запускать Xcuitests параллельно?
  • Как сделать файл Pod из одного проекта и добавить в свой собственный проект в iOS?
  • Длительное время сборки Swift
  • Как получить файл / ресурс в пакете инфраструктуры iOS из основной программы?
  • xcode warning - каталог после -L не найден
  • Отображаемое имя игрока игрового центра Всегда «me» в песочнице
  • Получить дату и время с Apple Server
  • Interesting Posts

    Как сделать эквивалент объектно-C mutableCopy в Monotouch?

    canMoveRowAtIndexPath не вызывается – но canEditRowAtIndexPath делает

    Разрешено ли загружать собственные объявления в приложении iPhone?

    Push view из push-уведомления

    Paypal MPL sdk с поддержкой кредитной карты

    iOS получает частоту сердечных сокращений от Apple Watch в ближайшем реальном времени

    Stitch / Composite несколько изображений по вертикали и сохранить как одно изображение (iOS, цель-c)

    Приложение для передней камеры iOS

    привязка обновлений UITableview в основной теме

    Есть ли доступный для iOS API для обнаружения пьяного человека?

    – : сообщение, отправленное на освобожденный экземпляр

    Как мне вызывать расширение для редактирования фотографий iOS?

    Worklight 6.1 «доступ к защищенным службам запрещен» после того, как приложение развернуто в App Store

    Создание приложения с функцией электронной подписи для ios, возможно, с помощью монофонического?

    Как построить GCC от Apple в Linux / Windows?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.