Iphone: come scorrere fino alla prima cella della seconda sezione, lasciando che l'intestazione della prima sezione visibile
-
15-10-2019 - |
Domanda
Ho un UITableView con righe e le sezioni. Vorrei scorrere fino al primo punto della seconda sezione, lasciando che l'intestazione della prima sezione visibile. Come se avessi scorrere manualmente l'elenco fino a raggiungere quello stato.
---- 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 inSection: 1] non fare il lavoro, si nasconde l'intestazione della prima sezione.
Soluzione
Ci stiamo muovendo su. Ho trovato questo metodo basato su un'idea di Kevin. Per essere in grado di impostare animato a YES, prendo la fine di animazione utilizzando un metodo delegato di UIScrollView. Funziona. Ma qualsiasi soluzione che aiuterebbe non fare 2 animazioni sarebbe molto apprezzato. Qualche idea su come fare questo?
- (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];
}
Amico a questo codice, il processo quando animato è impostato su SI deve essere ripetuto all'infinito beetween scrollViewDidEndScrollingAnimation e showFirstHeaderLine ... E 'loop, sì, ma solo una volta ... Qualche idea sul perché?
Altri suggerimenti
È possibile prendere il rettangolo per la riga che si desidera, quindi sottrarre l'altezza dell'intestazione della sezione precedente e scorrere fino a quel punto. Qualcosa di simile a quanto segue (non testato) dovrebbe funzionare:
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
Ho cercato il tuo codice, e funziona !!
Per la questione del ciclo, dal momento che si sta impostando un offset (SetContentOffset), non ha nulla a che fare con la pergamena. Non è chiamerà ScrollView delegato. SO lo scrollViewDidEndScrollingAnimation sarà chiamato solo una volta, che è stato chiamato da scrollToRowAtIndexPath.