Iphone: Comment faites défiler jusqu'à la 1ère cellule de la 2ème section, laissant l'en-tête de la 1ère partie visible

StackOverflow https://stackoverflow.com/questions/4597839

Question

J'ai un UITableView avec des lignes et des sections. Je voudrais défiler jusqu'au premier élément de la deuxième section, laissant l'en-tête de la première section visible. Comme si je l'avais fait défiler manuellement la liste jusqu'à atteindre cet état.

---- TOP OF SCREEN ----
Header of first section
Header of the second section
cell 1
cell 2
cell 3
Header of the third section
cell 1
cell 2
...

scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 lasection: 1] ne fait pas le travail, il cache l'en-tête de la première section.

Était-ce utile?

La solution

Nous allons passer. J'ai trouvé cette méthode basée sur l'idée de Kevin. Pour pouvoir ensemble d'animation OUI, je prends la fin de l'animation en utilisant une méthode de délégué de UIScrollView. Ça marche. Mais toute solution qui contribuerait à ne pas faire 2 animations serait grandement apprécié. Toute idée sur la façon de le faire?

- (IBAction) scrollToToday:(BOOL)animate {
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:animate];
    if (animate == NO) [self showFirstHeaderLine:NO];
}

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    [self showFirstHeaderLine:YES];
}

- (void) showFirstHeaderLine:(BOOL)animate {
    CGRect headerRect = [self.tableView rectForHeaderInSection:1];
    CGPoint scrollPoint = headerRect.origin;
    scrollPoint.y -= headerRect.size.height;
    [self.tableView setContentOffset:scrollPoint animated:animate];
}

Mec à ce code, le processus lorsque animé est réglé sur OUI doit boucler infiniment beetween scrollViewDidEndScrollingAnimation et showFirstHeaderLine ... Il boucles, oui, mais une seule fois ... Toute idée de pourquoi?

Autres conseils

Vous pouvez saisir le rect pour la ligne que vous voulez, puis soustrayez la hauteur de l'en-tête de la section précédente et faites défiler jusqu'à ce point. Quelque chose comme ce qui suit (non testé) devrait fonctionner:

CGRect rowRect = [table rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];
CGRect headerRect = [table rectForHeaderInSection:0];
rowRect.origin.y -= headerRect.size.height;
rowRect.size.height += headerRect.size.height;
[table scrollRectToVisible:rowRect animated:YES]; // UITableView is a subclass of UIScrollView

J'ai essayé votre code, et il fonctionne !!

Pour la question de la boucle, puisque vous définissez un décalage (SetContentOffset), il n'a rien à voir avec le rouleau. Il est délégué ne sera pas appeler ScrollView. SO le scrollViewDidEndScrollingAnimation sera appelée une seule fois, ce qui a été appelé à partir scrollToRowAtIndexPath.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top