web-dev-qa-db-fra.com

Comment faire défiler vers le haut dans IOS7 UITableView?

Dans IOS6 j'ai le code suivant pour faire défiler vers le haut d'un UITableView

[tableView setContentOffset:CGPointZero animated:YES];

Dans IOS7, cela ne fonctionne plus. La vue sous forme de tableau ne défile pas complètement vers le haut (mais presque).

43
Markus Johansson

Avec l'aide de quelques autres réponses ici, j'ai réussi à le faire fonctionner. Pour éviter un crash, je dois d'abord vérifier qu'il y a des sections. NsNotFound peut être utilisé comme index de ligne si la première section ne contient aucune ligne. Espérons que cela devrait être une fonction générique à placer dans un UITableViewController:

-(void) scrollToTop
{
    if ([self numberOfSectionsInTableView:self.tableView] > 0)
    {
        NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
        [self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
}
16
Markus Johansson

Dans iOS7, les composants UITableView et UIScrollView pour tout l'écran, ajustent par défaut le contenu et les incrustations d'indicateurs de défilement pour que tout fonctionne correctement. Cependant, comme vous l'avez remarqué, CGPointZero ne représente plus le décalage de contenu qui vous amène au "sommet" visuel.

Utilisez ceci à la place:

self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top);

Ici, vous n'avez pas à vous inquiéter si vous avez des sections ou des rangées. De plus, vous ne dites pas à la vue Table de cibler la première ligne, puis vous vous demandez pourquoi elle n'affiche pas toute votre très grande vue d'en-tête de table, etc.

127
idStar

Essaye ça: 

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
23
Harikrishnan

D'après la réponse acceptée de @Markus Johansson, voici la version du code Swift:

func scrollToTop() {
    if (self.tableView.numberOfSections > 0 ) {
        let top = NSIndexPath(row: Foundation.NSNotFound, section: 0)
        self.tableView.scrollToRow(at: top as IndexPath, at: .top, animated: true);
    }
}
22
cashmash
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.sampleTableView.scrollToRowAtIndexPath(indexPath,
atScrollPosition: UITableViewScrollPosition.Top, animated: true)

ou 

self.sampleTableView.setContentOffset(CGPoint.zero, animated:false)
4
A.G

Voici la syntaxe answer d'idStar dans la nouvelle syntaxe de Swift 3:

self.tableView.contentOffset = CGPoint(x: 0, y: 0 - self.tableView.contentInset.top)

Avec animation:

self.tableView.setContentOffset(CGPoint(x: 0, y: 0 - self.tableView.contentInset.top), animated: true)
3
DerFlickschter

Swift 3

Si vous avez des en-têtes de vue sous forme de tableau, CGPointZero peut ne pas fonctionner pour vous, mais cela vous permet toujours de faire défiler vers le haut.

self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
3
RiceAndBytes
float systemVersion= [[[UIDevice currentDevice] systemVersion] floatValue];

if(systemVersion >= 7.0f)
{
  self.edgesForExtendedLayout=UIRectEdgeNone;   
}

Essayez ce code dans la méthode viewDidLoad().

3
Jitendra

Je réalise que cela a été répondu mais je voulais juste donner une autre option:

CGRect frame = {{0, 0},{1, 1}};
[self.tableView scrollRectToVisible:frame animated:YES];

Cela garantit toujours que UITableView fera défiler vers le haut. La réponse acceptée:

NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];

ne fonctionnait pas pour moi parce que je faisais défiler une tableHeaderView et non une cellule. 

Utiliser scrollRectToVisible fonctionne sur iOS 6 et 7.

2
Chris

vous pouvez toujours utiliser scrollToRowAtIndexPath: à cette fin

2
Lithu T.V

Swift 4 UITableViewExtension:

func scrollToTop(animated: Bool) {
    if numberOfSections > 0 {
        let topIndexPath = IndexPath(row: NSNotFound, section: 0)
        scrollToRow(at: topIndexPath, at: .top, animated: animated)
    }
}
1
Sunkas

à Swift j'ai utilisé: 

self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)

mais @Alvin George fonctionne très bien 

0
SpyZip