2010-11-04 13 views
6

Hola chicos. Tengo un problema para animar eliminaciones e inserciones en una UITableView. El hecho es que tengo diferentes alturas, algunos 44.0 y 135.0 ahora. Tengo uitableviewstyle agrupado con diferentes secciones. la primera fila de cada sección es una fila de agrupación. al hacer clic, elimino todas las filas de esta sección, excepto la fila de agrupación. pero esa animación se ve extraña, al animar (UITableViewRowAnimationTop) la celda de altura de 135px. Intenté establecer self.tableview.cellheight en 135 y comento el tableView: cellHeightForIndexPath-Method. Y la animación funciona bien. O configuro cada celda a 135 en tableView: cellHeightForIndexPath-Method.Problema con RowAnimation

Parece que el proceso de animación verifica la altura de la primera fila en las secciones que toman la altura de la celda para animar a todas las celdas siguientes.

¿Alguien una idea?


- (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

debe publicar la vista de tabla delegar el código fuente. – karim

+0

ok nadie tiene una idea ... parece tan – kaelum

+0

He tenido esto funcionando, así que creo que es un error en tu código. Necesita publicar el código COMPLETO, o (mejor) hacer un pequeño ejemplo del problema. Además, debe ser más específico para describir exactamente cómo se ve "raro"; nadie puede ayudarlo con esa vaguedad. – Adam

Respuesta

0

Una vieja que aún no ha sido respondida. Supongo que ya lo descubriste hace mucho tiempo, pero este es mi primer pensamiento. (Recuerdo tratar de hacer algo como esto yo mismo.)

Cuando el UITableView llama a , será porque la tabla está tratando de preparar la celda, por lo que no puede usar la celda para devolver la altura. Esto puede causar una regresión infinita en las llamadas o puede detectar esto y simplemente renunciar o lanzar una excepción y dejarlo sosteniendo la bolsa.

Debe calcular la altura de la celda sin usar la misma celda.

En cuanto a la suposición de altura de celda, intente insertar/eliminar para celdas individuales en lugar de una sola llamada para hacerlo todo a la vez. El UITableView todavía los lotes para la animación después de llamar al endUpdates.

2

Tuve el mismo problema. Mi solución es utilizar sección de animación de fundido:

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

En lugar de una para elementos:

[tableView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 

Esto se ve mucho más suave.