2013-08-10 3 views
7

J'insère une nouvelle section (section contenant 3 cellules) en haut de UITableView tout en DÉFILEMENT EN HAUT.UITableView insertion de la section en haut pendant le défilement

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

Section s'introduit correctement. Mais cela me prend en tête de la table, c'est-à-dire la cellule 0 ou la ligne 0. Je veux que cette transaction soit fluide. Je peux insérer

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

après endUpdates mais il montre rapide secousse, car il faut vous en haut du tableau puis faites défiler tout d'un coup à votre dernière position.

Comment puis-je le rendre lisse.

Merci

Répondre

9

Je n'ai pas fait de tests exhaustifs à ce sujet, mais cela semble prometteur:

  1. Identifier NSIndexPath de l'une des cellules visibles.
  2. Obtenez le rectForRowAtIndexPath. Obtenez le contentOffset actuel de la table, lui-même.
  3. Ajoutez la section, mais appelez reloadData au lieu de insertSections (ce qui empêche le défilement).
  4. Obtenez les mises à jour rectForRowAtIndexPath que vous avez obtenu à l'étape 2.
  5. Mise à jour contentOffset par la différence du résultat de l'étape 5 et celle de l'étape 2.

Ainsi:

[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

Merci beaucoup mate. Je luttais avec ça depuis longtemps. – Mann

+0

Bien que le code ci-dessus fonctionne comme charme, mais pour ma compréhension personnelle, je n'ai pas obtenu le point 5. Pourquoi nous avons besoin de vieux rectangle ici? Je serais très reconnaissant si vous l'effacez – Mann

+1

@mann J'essayais juste de voir à quel point l'une des rangées visibles s'est déplacée vers le bas. Donc j'obtiens le rect pour une ligne visible avant l'insertion et de nouveau, après, et ensuite j'utilise la différence entre les valeurs 'y' pour ajuster le' contentOffset' devrait être pour que la ligne apparaisse au même endroit qu'avant. – Rob

Questions connexes