2010-11-04 18 views
6

Salut les gars. J'ai un problème avec l'animation des suppressions et des insertions sur un UITableView. Le fait est que j'ai différentes hauteurs de cellules, certaines 44,0 environ 135,0 maintenant. J'ai uitableviewstylegrouped avec différentes sections. la première rangée de chaque section est une rangée de regroupement. Au clic, je supprime toutes les lignes de cette section sauf la ligne de regroupement. mais cette animation semble bizarre, lors de l'animation (UITableViewRowAnimationTop) de la cellule 135px. J'ai essayé de mettre self.tableview.cellheight à 135 et ai commenté la tableView: cellHeightForIndexPath-Method. Et l'animation fonctionne bien. Ou je place chaque table de cellules à 135 dans tableView: cellHeightForIndexPath-Method.Problème avec RowAnimation

Il semble que le processus d'animation vérifie la hauteur de la première ligne dans les sections et prend cette hauteur de la cellule pour toutes les cellules suivantes à animer.

Quelqu'un a une idée?


- (void) showhideGroup:(int)group 
{ 
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 

    MCGroup *handleGroup = [groups objectAtIndex:group]; 
    NSMutableArray *groupRows = [visibleGroupData objectForKey:handleGroup.title]; 

    [self.tableView beginUpdates]; 

    if (!handleGroup.hidden) { 
     int row = 0; 
     for(MobileFieldMapping *field in groupRows) 
     { 
      if (![field.datatype matchesInsensitive:GROUPING_CELL]) 
      { 
       NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group]; 
       [indexPaths addObject:path]; 
      } 
      row++; 
     } 

     row = 0; 
     for(NSIndexPath *index in indexPaths) 
     { 
      [groupRows removeObjectAtIndex:index.row-row]; 
      row++; 
     } 
     [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; 
     handleGroup.hidden=YES; 
    } 
    else 
    { 
     NSMutableArray *allGroupRows = [groupData objectForKey:handleGroup.title]; 

     int row = 0; 
     for (MobileFieldMapping *field in allGroupRows) 
     { 
      if (![groupRows containsObject:field]) 
      { 
       NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group]; 
       [indexPaths addObject:path]; 
       [groupRows insertObject:field atIndex:row]; 
      } 
      row++; 
     } 

     [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; 
     handleGroup.hidden=NO; 
    } 
    [self.tableView endUpdates]; 


    [indexPaths release]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    if ([cell isKindOfClass:[FormCell class]]) 
    { 
     return [(FormCell*)cell height]; 
    } 

    return 44.0; 
} 
+0

vous devez publier le code source du délégué tableau. – karim

+0

ok personne n'a une idée ... semble tellement – kaelum

+0

J'ai eu ce travail, donc je pense que c'est un bug dans votre code. Vous devez publier le code FULL, ou (mieux) faire un petit exemple du problème. En outre, vous devez être plus précis en décrivant exactement comment cela "semble bizarre" - personne ne peut vous aider avec un tel flou. – Adam

Répondre

0

Un ancien qui est toujours sans réponse. Je suppose que vous l'avez compris il y a longtemps, mais voici ma première pensée. Lorsque le UITableView appelle heightForRowAtIndexPath:, ce sera parce que la table essaie de préparer la cellule, donc vous ne pouvez pas utiliser la cellule pour retourner la hauteur. Cela peut provoquer une régression infinie dans les appels ou il peut détecter cela et abandonner ou lancer une exception et vous laisser tenir le sac.

Vous devez calculer la hauteur de la cellule sans utiliser la cellule elle-même. En ce qui concerne l'hypothèse de hauteur de cellule, essayez d'appeler insert/delete pour des cellules individuelles plutôt qu'un seul appel pour tout faire en une seule fois. Le UITableView continuera de les charger pour l'animation après avoir appelé endUpdates.

2

J'ai eu le même problème. Ma solution est d'utiliser l'animation de la section Fade:

[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 

Au lieu d'un pour les éléments:

[tableView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 

Cela ressemble beaucoup plus lisse.