2013-08-10 14 views
7

Sto inserendo una nuova sezione (sezione contiene 3 celle) in cima a UITableView mentre SCROLLING TOP.UITableView inserimento sezione in alto durante lo scorrimento

 [_mainTable beginUpdates]; 
     [_mainTable insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
     [_mainTable endUpdates]; 

La sezione viene inserita correttamente. Ma mi porta in cima alla tabella, cioè cella 0 o riga 0. Voglio che questa transazione sia liscia. Posso inserire

[_mainTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 

dopo endUpdates ma mostra scatto veloce perché ci vuole cima della Table poi improvvisamente scorrere fino alla vostra ultima posizione.

Come posso renderlo scorrevole.

Grazie

risposta

9

Non ho fatto test approfonditi su questo, ma questo sembra promettente:

  1. Identificare NSIndexPath di una delle celle visibili.
  2. Ottieni il suo rectForRowAtIndexPath.
  3. Ottieni l'attuale contentOffset della tabella.
  4. Aggiungere la sezione, ma chiamare reloadData anziché insertSections (che impedisce lo scorrimento ostruito).
  5. Ottenere la versione aggiornata rectForRowAtIndexPath che avete ottenuto nel passaggio 2.
  6. Aggiornamento contentOffset dalla differenza del risultato dal punto 5 e quella della fase 2.

Così:

[self.sections insertObject:newSection atIndex:0]; // this is my model backing my table 

NSIndexPath *oldIndexPath = self.tableView.indexPathsForVisibleRows[0]; // 1 
CGRect before = [self.tableView rectForRowAtIndexPath:oldIndexPath];  // 2 
CGPoint contentOffset = [self.tableView contentOffset];     // 3 
[self.tableView reloadData];            // 4 
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row inSection:oldIndexPath.section + 1]; 
CGRect after = [self.tableView rectForRowAtIndexPath:newIndexPath];  // 5 
contentOffset.y += (after.origin.y - before.origin.y); 
self.tableView.contentOffset = contentOffset;        // 6 
+1

Grazie molto amico. Ho lottato con questo a lungo. – Mann

+0

Anche se il codice sopra funziona come un incantesimo ma per la mia comprensione personale non ho ottenuto il punto 5. Perché abbiamo bisogno del vecchio rettangolo qui? Sarei molto grato se lo cancelli. – Mann

+1

@mann Stavo solo provando a vedere quanto una delle righe visibili si è spostata verso il basso. Quindi ottengo il rect per una riga visibile prima dell'inserimento e di nuovo, dopo, e quindi utilizzo la differenza tra i valori di 'y' per regolare il' contentOffset' dovrebbe essere in modo che la riga appaia nello stesso posto di prima. – Rob

Problemi correlati