UITableView Expandir y colapsar para mostrar una celda parcial o completamente

Tengo UITableView que usa un commentTableCell que tiene una altura de aproximadamente 200 píxeles y tiene texto e imágenes.

Esperaba que cuando una fila no esté seleccionada, la altura de la fila sea de aproximadamente 65 píxeles, lo que ocultará todas las imágenes y cuando la fila se expanda a 200 píxeles, commentTableCell se expandirá por completo y, por lo tanto, las imágenes dentro de la celda se verán expuesto.

Pero el problema que tengo es que cuando todas las filas se colapsan a 65 píxeles de altura, no se debe mostrar ninguna de las imágenes del commentTabelCell, pero obtengo imágenes fantasma o parciales de la celda que se muestra en alguna parte de la tabla. ¿Por qué?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{            
        static NSString *CellIdentifier = @"customCell";

        CommentTableCell *cell = (CommentTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        return cell;    
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
        if(selectedIndex == indexPath.row)
        {

            return 200;
        }
        else {

            return 65;
        }  
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        //The user is selecting the cell which is currently expanded
        //we want to minimize it back
        if(selectedIndex == indexPath.row)
        {
            selectedIndex = -1;
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

            return;
        }

        //First we check if a cell is already expanded.
        //If it is we want to minimize make sure it is reloaded to minimize it back
        if(selectedIndex >= 0)
        {
            NSIndexPath *previousPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
            selectedIndex = indexPath.row;
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:previousPath] withRowAnimation:UITableViewRowAnimationFade];        
        }

        //Finally set the selected index to the new selection and reload it to expand
        selectedIndex = indexPath.row;
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

preguntado el 12 de junio de 12 a las 22:06

1 Respuestas

Tengo una solución alternativa. Prueba esto:

// ----------------------------//

// Put this somewhere in your .h file:  
NSIndexPath *selectedCellIndexPath;  

// ----------------------------//

// Set your default row height
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
    return 65;  
}  

// In the implementation file:  
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
    selectedCellIndexPath = indexPath;  

   // Forces the table view to call heightForRowAtIndexPath  
   [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];  
}  

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
    // Note: Some operations like calling [tableView cellForRowAtIndexPath:indexPath]  
    // will call heightForRow and thus create a stack overflow  
    if(selectedCellIndexPath != nil && [selectedCellIndexPath compare:indexPath] == NSOrderedSame)  
        return 200;  

    return 65;  
}  

Respondido el 13 de junio de 12 a las 01:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.