418 votes

UITableView - faire défiler vers le haut

Dans ma vue en tableau, je dois faire défiler l'écran jusqu'en haut. Mais je ne peux pas garantir que le premier objet sera la section 0, rangée 0. Il se peut que mon tableau commence à la section numéro 5.

Donc j'obtiens une exception, quand j'appelle :

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

Existe-t-il un autre moyen de faire défiler le haut de la vue tableau ?

906voto

catlan Points 9896

UITableView est une sous-classe de UIScrollView, vous pouvez donc également utiliser :

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

Ou

[mainTableView setContentOffset:CGPointZero animated:YES];

Et dans Swift :

mainTableView.setContentOffset(CGPointZero, animated:true)

Et dans Swift 3 et plus :

mainTableView.setContentOffset(.zero, animated: true)

0 votes

Cela a aussi fonctionné pour moi, même avec un tableHeaderView.

0 votes

Merci. J'ai juste ajouté cela à ma ligne 'scrollToRowAtIndexPath' et le défilement fonctionne bien maintenant.

11 votes

J'ai d'abord essayé avec CGRectZero, qui est équivalent à CGRectMake(0, 0, 0, 0). Cela ne fonctionne pas, mais bizarrement, la méthode ci-dessus fonctionne. Je suppose qu'il faut une largeur et une hauteur positives. Merci.

250voto

fabb Points 3471

Note : Cette réponse n'est pas valable pour iOS 11 et les versions ultérieures.

Je préfère

[mainTableView setContentOffset:CGPointZero animated:YES];

Si vous avez un encart supérieur sur votre vue de table, vous devez le soustraire :

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];

12 votes

Tomate, tomate. Hmm... Ce n'est pas très clair à l'écrit.

14 votes

C'est la meilleure façon de procéder lorsque vous avez des vues d'en-tête ou de pied de tableau et que vous souhaitez qu'elles soient également incluses.

7 votes

Il s'agit en effet d'un code clair, mais il ne fonctionne pas lorsque votre tableView a une valeur non nulle contentInset du haut. Par exemple : tableView.contentInset = UIEdgeInsetsMake(5.0f, 0.0f, 250.0f, 0.0f); . Si c'est le cas, dans votre code, l'option tableView défile jusqu'à (0.0f, 5.0f) .

89voto

A.G Points 9897

Actions possibles :

1

func scrollToFirstRow() {
    let indexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}

2

func scrollToLastRow() {
    let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
}

3

func scrollToSelectedRow() {
    let selectedRows = self.tableView.indexPathsForSelectedRows
    if let selectedRow = selectedRows?[0] as? NSIndexPath {
        self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)
    }
}

4

func scrollToHeader() {
    self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
}

5

func scrollToTop(){
    self.tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
}

Désactiver la fonction "Scroll To Top" :

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
    for subview in view.subviews {
        if let scrollView = subview as? UIScrollView {
            (scrollView as UIScrollView).scrollsToTop = false
        }
        self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
    }
}

Modifiez-le et utilisez-le selon vos besoins.

Swift 4

  func scrollToFirstRow() {
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }

27voto

Kof Points 3501

Il est préférable de ne pas utiliser NSIndexPath (table vide), ni de supposer que le point supérieur est CGPointZero (insets de contenu), c'est ce que j'utilise -

[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];

J'espère que cela vous aidera.

0 votes

N'est plus valable à partir de iOS 11.

23voto

mrhevor Points 18

Swift 4 :

Cela fonctionne très bien :

//self.tableView.reloadData() if you want to use this line remember to put it before 
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X