UITableView, прокрутите вниз до перезагрузки?

У меня есть UITableView с динамически обновляемыми cells . Все отлично работает, когда вызывается tableview.reload (см. Ниже), чтобы обновить cells в таблице. Мне бы хотелось, чтобы таблица прокручивалась вниз, чтобы отображать новые записи.

 - (void)reloadTable:(NSNotification *)notification { NSLog(@"RELOAD TABLE ..."); [customTableView reloadData]; // Scroll to bottom of UITable here .... } 

Я планировал использовать scrollToRowAtIndexPath:atScrollPosition:animated: но потом заметил, что у меня нет доступа к indexPath .

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

Использование:

 NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1]; [tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES]; 

Или вы можете указать индекс раздела вручную (если один раздел => индекс = 0).

 -(void)scrollToBottom{ [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]; } 

Другое решение – перевернуть стол по вертикали и перевернуть каждую ячейку по вертикали:

При инициализации примените преобразование к UITableView:

 tableview.transform = CGAffineTransformMakeScale(1, -1); 

и в cellForRowAtIndexPath:

 cell.transform = CGAffineTransformMakeScale(1, -1); 

Таким образом, вам не нужны обходные пути для прокрутки, но вам нужно будет немного подумать о contentInsets / contentOffsets и взаимодействиях header / footer.

 //In swift var iPath = NSIndexPath(forRow: self.tableView.numberOfRowsInSection(0)-1, inSection: self.tableView.numberOfSections()-1) self.tableView.scrollToRowAtIndexPath(iPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true) 

Это еще одно решение, хорошо работающее в моем случае, когда высота ячейки велика.

 - (void)scrollToBottom { CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height); if ( bottomOffset.y > 0 ) { [_bubbleTable setContentOffset:bottomOffset animated:YES]; } } 

Поскольку это то, что вы, возможно, захотите использовать очень часто, я предлагаю вам создать расширение classа в UITableView:

 extension UITableView { func scrollToBottom(animated: Bool = true) { let section = self.numberOfSections if section > 0 { let row = self.numberOfRowsInSection(section - 1) if row > 0 { self.scrollToRowAtIndexPath(NSIndexPath(forRow: row - 1, inSection: section - 1), atScrollPosition: .Bottom, animated: animated) } } } } 

расширение лучше делать в UIScrollView вместо UITableView, таким образом он работает на scrollView, tableView, collectionView (вертикальный), UIWebView (внутренний просмотр прокрутки) и т. д.

 public extension UIScrollView { public func scrollToBottom(animated animated: Bool) { let rect = CGRectMake(0, contentSize.height - bounds.size.height, bounds.size.width, bounds.size.height) scrollRectToVisible(rect, animated: animated) } } 

Это лучший способ.

 - (void)scrollToBottom { CGFloat yOffset = 0; if (self.tableView.contentSize.height > self.tableView.bounds.size.height) { yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height; } [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO]; } 

попробуйте этот код, он может вам помочь:

  self.tableView.reloadData() DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.1, execute: { let indexPath = IndexPath(row: self.dateSource.count-1, section: 0) self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true) }) 

Swift 3

Для всех людей, пытающихся выяснить, как решить эту проблему, ключом является вызов .layoutIfNeeded() после .reloadData() :

 tableView.reloadData() tableView.layoutIfNeeded() tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.height), animated: false) 

Я работал с несколькими разделами в UITableView и он работал хорошо.

  • Как я могу «разрезать» прозрачное отверстие в UIImage?
  • Выполнение команд оболочки с помощью NSTask - Objective-C Cocoa
  • Есть ли какие-либо frameworks для выделения текста в pdf-файле после рендеринга на iphone
  • как создать круглую кнопку?
  • UITableViewCell расширяется по клику
  • QLPreviewController удаляет или добавляет UIBarButtonItems
  • Круговые контрольные бары в IOS
  • NSDictionary с упорядоченными ключами
  • Что такое двойная звезда (например, NSError **)?
  • UISlider вместе с ProgressView
  • Как установить получателей для UIActivityViewController в iOS 6?
  • Давайте будем гением компьютера.