2009-12-14 14 views
5

Duplicar posibles:
Can you animate a height change on a UITableViewCell when selected?altura Animate UITableViewCell en la selección

que he estado haciendo un montón de buscar en Google para tratar de averiguar la forma correcta de hacer esto, y hasta el momento Estoy en una pérdida.

He subestimado UITableViewCell con mi propia vista y estoy tratando de animar el alto de una UITableViewCell para expandir cuando se selecciona, y contratar cuando se selecciona de nuevo. Esta tabla tiene el potencial de contener miles de filas, por lo que no quiero anular el valor heightForRowAtIndexPath de tableView. Idealmente, me gustaría poder expandir más de una celda a la vez, pero eso no es tan crítico. ¿Cuál es la mejor manera de hacer esto?

Gracias, Justin

Respuesta

6

No hay otro mecanismo para especificar altura de la celda de heightForRowAtIndexPath. A menos que esté contabilizando correctamente la celda expandida en ese método, encontrará que sus otras celdas la están pasando o están escondidas debajo de ella. Desde un código absurdo donde olvidé configurar heightForRowAtIndexPath, estoy bastante seguro de que se mostrarán las otras celdas sobre él.

Dado que estamos hablando de miles de filas, supondremos que el usuario no puede reorganizar las celdas.

Lo que podría hacer es almacenar la ruta de índice de la celda expandida cuando el usuario toca una celda determinada. Entonces, heightForRowAtIndexPath podría tener este aspecto:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

if ([indexPath isEqual:lastSelectedIndexPath]) 
{ 
    return 80; 
} 

else { 
    return 44; 
} 

} 

Si realmente desea seleccionar varias opciones, se podría almacenar las rutas de índice correspondientes a una matriz y comprobar por ellos así:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

CGFloat cellHeight = 44; 

for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray) 
{ 
    if ([indexPath compare:expandedIndexPath] == NSOrderedSame) 
    { 
     cellHeight = 80; 
     break; 
    } 
} 

return cellHeight; 

} 

Conseguir que la animación mirar a la derecha llevará algo de trabajo. He jugado con esta idea de IU en particular por un tiempo y nunca pude sentarme y realmente hacer que suceda. Una cosa que podría hacer es mostrar una vista ficticia que se anima mientras está actualizando la vista de tabla detrás de ella.

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation 

podrían ser de interés para esta medida que podría ser capaz de utilizar las animaciones celulares para simular el movimiento de las células a continuación para dar cabida a su expansión.

Si puede renunciar a animar el cuadro de la celda por completo, puede hacer una animación de opacidad de los datos expandidos una vez que se haya establecido la nueva altura.

Es difícil, pero si lo haces funcionar, apuesto a que será genial. Buena suerte.

+1

Gracias Danilo, me pusiste en el camino correcto. Terminé haciéndolo funcionar usando reloadRowsAtIndexPaths dentro de didSelectRowAtIndexPath. Verifico si la celda está expandida y configuré la altura correspondiente en heightForRowAtIndexPath, tal como lo mencionó. ¡Gracias de nuevo! – Justin

+1

¡Demasiado genial! Me alegro de darle un empujoncito útil. Espero que funcione. Quizás finalmente lo probaré uno de estos días. –

+1

'[indexPath compare: expandedIndexPath] == NSOrderedSame' debe escribirse como' [indexPath isEqual: expandedIndexPath] ' – user102008

Cuestiones relacionadas