Encontré una solución REALMENTE SIMPLE para esto como efecto secundario de un UITableView
trabajo en el que estaba trabajando .....
Almacene la altura de la celda en una variable que informa la altura original normalmente a través de tableView: heightForRowAtIndexPath:
, luego, cuando desee animar un cambio de altura, simplemente cambie el valor de la variable y llame a esto ...
[tableView beginUpdates];
[tableView endUpdates];
Descubrirá que no se recarga completamente, pero es suficiente para UITableView
saber que tiene que volver a dibujar las celdas, tomando el nuevo valor de altura para la celda ... ¿y adivina qué? ANIMA el cambio para ti. Dulce.
Tengo una explicación más detallada y ejemplos de código completo en mi blog ... Animar UITableView Cell Height Change
You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.
developer.apple.com/library/ios/documentation/UIKit/Reference/…Me gusta la respuesta de Simon Lee. En realidad no probé ese método, pero parece que cambiaría el tamaño de todas las celdas de la lista. Esperaba un cambio de solo la celda que está intervenida. Lo hice como Simon pero con una pequeña diferencia. Esto cambiará el aspecto de una celda cuando se seleccione. Y lo hace animado. Solo otra forma de hacerlo.
Cree un int para contener un valor para el índice de celda seleccionado actual:
Entonces:
Entonces:
Estoy seguro de que puede hacer cambios similares en tableView: cellForRowAtIndexPath: para cambiar el tipo de celda o incluso cargar un archivo xib para la celda.
De esta forma, la selección actual comenzará en 0. Debería hacer ajustes si no desea que la primera celda de la lista (en el índice 0) se vea seleccionada de forma predeterminada.
fuente
Agregue una propiedad para realizar un seguimiento de la celda seleccionada
Ajústelo a un valor centinela en (por ejemplo)
viewDidLoad
, para asegurarse de queUITableView
comience en la posición 'normal'En
heightForRowAtIndexPath
puede establecer la altura que desea para la celda seleccionadaEn
didSelectRowAtIndexPath
guardar la selección actual y guardar una altura dinámica, si es necesarioEn
didDeselectRowAtIndexPath
establecer el índice de selección de nuevo al valor centinela y animar la celda a su forma normalfuente
reloadData no es bueno porque no hay animación ...
Esto es lo que estoy intentando actualmente:
Casi funciona bien. Casi. Estoy aumentando la altura de la celda, y a veces hay un pequeño "hipo" en la vista de tabla a medida que se reemplaza la celda, como si se conservara alguna posición de desplazamiento en la vista de tabla, la nueva celda (que es la primera celda en la tabla) termina con su desplazamiento demasiado alto, y la vista de desplazamiento rebota para reposicionarlo.
fuente
No sé qué es todo esto sobre llamar a beginUpdates / endUpdates en sucesión, solo puedes usarlo
-[UITableView reloadRowsAtIndexPaths:withAnimation:]
. Aquí hay un proyecto de ejemplo .fuente
Resolví con
reloadRowsAtIndexPaths
.didSelectRowAtIndexPath
Guardo en el indexPath de la celda seleccionada y llamoreloadRowsAtIndexPaths
al final (puede enviar NSMutableArray para obtener una lista de los elementos que desea recargar).En
heightForRowAtIndexPath
puede verificar si indexPath está en la lista o no de las celdas expandIndexPath y enviar la altura.Puede consultar este ejemplo básico: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Es una solución simple.
agrego una especie de código si te ayudo
fuente
En lugar de
beginUpdates()
/endUpdates()
, la llamada recomendada es ahora:Apple dice, con respecto a beginUpdates / endUpdates: "Use el método performBatchUpdates (_: complete :) en lugar de este siempre que sea posible".
Ver: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates
fuente
Pruebe esto para expandir la fila indexwise:
fuente
fuente
solo una nota para alguien como yo buscando agregar "Más detalles" en la celda personalizada.
Hizo un trabajo excelente, pero no olvide "recortar" la vista de celda. Desde Interface Builder, seleccione su Celda -> Vista de contenido -> desde el Inspector de propiedades seleccione " Subvista de clip "
fuente
Aquí hay una versión más corta de la respuesta de Simons para Swift 3. También permite alternar la selección de la celda
fuente
Swift 4 y superior
agregue el código a continuación en el método de delegado de fila didselect de su vista de tabla
fuente
Versión rápida de la respuesta de Simon Lee.
Luego en didSelectRowAtIndexPath ()
fuente
Si es posible.
UITableView
tiene un método delegadodidSelectRowAtIndexPath
Pero en su caso, si el usuario se desplaza y selecciona una celda diferente, entonces necesita tener la última celda seleccionada para reducir y expandir las
reloadRowsAtIndexPaths:
llamadas de celda actualmente seleccionadas ,heightForRowAtIndexPath:
así que maneje en consecuencia.fuente
Aquí está mi código de
UITableView
subclase personalizada , que se expandeUITextView
en la celda de la tabla, sin recargar (y perder el foco del teclado):fuente
Usé la increíble respuesta de @ Joy, y funcionó perfectamente con ios 8.4 y XCode 7.1.1.
En caso de que desee hacer que su celda sea capaz de alternar, cambié -tableViewDidSelect a lo siguiente:
Espero que todo esto te haya ayudado.
fuente
Verifique este método después de iOS 7 y posterior.
Se han realizado mejoras en esto en iOS 8. Podemos configurarlo como propiedad de la vista de tabla en sí.
fuente
Versión rápida de la respuesta de Simon Lee :
Tenga en cuenta que debe modificar las propiedades de altura ANTES
endUpdates()
.fuente
Entradas -
tableView.beginUpdates () tableView.endUpdates () estas funciones no llamarán
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Pero, si lo hace, tableView.reloadRows (en: [selectedIndexPath! Como IndexPath], con: .none)
Llamará al func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} esta función.
fuente
Acabo de resolver este problema con un pequeño truco:
Cuando necesito expandir la altura de la celda, configuro
isInEdit = YES
y llamo al método[self onTimer]
y anima el crecimiento de la celda hasta que alcanza el valor s_CellHeightEditing :-)fuente
Obtenga la ruta índice de la fila seleccionada. Recargar la mesa. En el método heightForRowAtIndexPath de UITableViewDelegate, establezca el alto de la fila seleccionada en un alto diferente y para los demás devuelva el alto de fila normal
fuente
[table reloadData]
resultados de llamadas en el cambio de altura ocurren instantáneamente, en lugar de animar.