UITableView, Faites défiler vers le bas sur recharger?

J’ai un UITableView avec des cells mises à jour dynamicment. Tout fonctionne bien sauf si on appelle tableview.reload (voir ci-dessous) pour actualiser les cells du tableau. Je voudrais que la table défile vers le bas pour afficher les nouvelles entrées.

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

J’avais l’intention d’utiliser scrollToRowAtIndexPath:atScrollPosition:animated: mais j’ai alors remarqué que je n’ai pas access à un indexPath .

Est-ce que quelqu’un sait comment faire, ou d’un rappel de delegate que je pourrais utiliser?

Utilisation:

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

Ou vous pouvez spécifier l’index de section manuellement (Si une section => index = 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]; } 

Une autre solution consiste à retourner la table verticalement et à retourner chaque cellule verticalement:

Appliquez la transformation à UITableView lors de l’initialisation:

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

et dans cellForRowAtIndexPath:

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

De cette façon, vous n’avez pas besoin de solutions de contournement pour les problèmes de défilement, mais vous devrez réfléchir un peu plus aux interactions entre contentInsets / contentOffsets et les en-têtes / pieds de page.

 //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) 

Ceci est une autre solution, a bien fonctionné dans mon cas, lorsque la hauteur de la cellule est grande.

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

Comme c’est quelque chose que vous voudrez peut-être utiliser très souvent, je vous suggère de créer une extension de classe sur 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) } } } } 

Il vaut mieux faire l’extension sur UIScrollView au lieu de UITableView, de cette façon cela fonctionne sur scrollView, tableView, collectionView (vertical), UIWebView (vue de défilement interne), etc.

 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) } } 

C’est la meilleur façon.

 - (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]; } 

essayez ce code, cela peut vous aider:

  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

Pour toutes les personnes ici essayant de comprendre comment résoudre ce problème, la clé consiste à appeler la méthode .reloadData() après .reloadData() :

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

Je travaillais avec plusieurs sections dans UITableView et cela fonctionnait bien.