ios - objective - the swift programming language pdf
¿Cómo le digo a mi UITableViewCell que "redimensione automáticamente" cuando cambia su contenido? (8)
Creo que la solución más simple es recargar esa celda específica. Por ejemplo:
- (void)yourDelegateMethodOfCell:(UITableViewCell *)cell {
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
//If cell is not visible then indexPath will be nil so,
if (indexPath) {
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
En mi cell.xib, tengo una etiqueta, con restricciones en todos sus lados. He establecido esa etiqueta en lines = 0
y line-break = word wrap
lines = 0
ajuste de line-break = word wrap
. Entonces, le hago esto a mi TableView:
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100.0
Todo funciona muy bien, y mi UITableViewCell es de altura automática. Si el texto es largo, entonces mi tableView calcula inteligentemente el tamaño.
El problema es: ¿cómo le digo a mi UITableView que "vuelva a calcular" el tamaño una vez que el contenido cambie en la celda?
Mi celular podría llamar a su delegado, y en este delegado, me gustaría que TableView vuelva a dibujar la altura.
En este momento, el contenido de mis celdas cambia constantemente, pero la altura de la celda nunca cambia.
Eche un vistazo a esta respuesta: Uso del diseño automático en UITableView para diseños de celdas dinámicos y alturas de fila variables
Cómo lograr un tamaño de celda dinámico se describe muy a fondo allí.
Como sugerencia para la prueba, intente agregar setNeedsLayout a:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
o
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
Entendí tu punto y resolví el problema antes.
Su celda está en AutoLayout y desea que la celda cambie por sí misma. Aquí está la respuesta recomendada para eso: usar el diseño automático en UITableView para diseños de celdas dinámicos y alturas de fila variables , por lo que no volveremos a hablar de eso.
Así que aquí nos centramos en su problema.
Dado que el contenido de su celda cambia constantemente, lo que significa que el contenido se ha actualizado. Aquí suponemos que el contenido es una etiqueta. Establecemos el texto de la etiqueta, y seguramente la altura de la etiqueta puede cambiar.
Aquí viene el punto: ¿Cómo los cambios de la etiqueta informan a la celda para que se actualice?
Utilizamos AutoLayout , seguramente tenemos que actualizar la restricción de altura para la etiqueta.
Y creo que funcionará!
A continuación se muestra el paso de detalle:
1. Configuramos las restricciones para las subvistas de la celda. (Creo que está hecho)
2. La altura de una de las etiquetas se cambia por sí misma (creo que también se hace)
3. Obtenemos la nueva altura de la etiqueta y actualizamos la restricción de altura de la etiqueta (lo que tenemos que hacer)
Hay una forma documentada de hacer esto. Consulte la documentation UITableView.beginUpdates()
:
También puede usar este método seguido del método endUpdates para animar el cambio en las alturas de las filas sin volver a cargar la celda.
Entonces, la solución correcta es:
tableView.beginUpdates()
tableView.endUpdates()
También tenga en cuenta que hay una característica que no está documentada; también puede agregar un controlador de finalización para la animación de actualización aquí:
tableView.beginUpdates()
CATransaction.setCompletionBlock {
// this will be called when the update animation ends
}
tableView.endUpdates()
Sin embargo, pise ligeramente, no está documentado (pero funciona porque UITableView
usa una CATransaction
para la animación).
He encontrado que la mejor manera de hacer que se compruebe alturas es llamar, después de cualquier cambio de texto realizado, en orden:
self.tableView.beginUpdates()
self.tableView.endUpdates()
Esto hace que el TableView verifique las alturas de todas las celdas visibles y hará que se realicen cambios según sea necesario.
Parece que querías recargar la celda en particular en función de los cambios de contenido
Aquí tenemos un par de opciones.
1) Necesidad de recargar toda la vista de tabla.
si no
2) Recargar celdas / celdas particulares basadas en cambios de contenido.
Pero la opción preferida sería recargar la celda particular,
Porque cuando le pidió a su instancia de UITableView que recargue un par de celdas, tableview le pedirá a su fuente de datos (-tableView: cellForRowAtIndexPath :) que obtenga el contenido actualizado, de modo que las celdas recargadas tengan el tamaño actualizado y el contenido actualizado también.
Intente volver a cargar las celdas cuando el contenido / altura necesite actualizarse en función del contenido
¡Espero que ayude! Feliz codificacion :)
Puede cambiar el tamaño de la altura de su celda implementando solo el método a continuación
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
Puede obtener altura de celda automática por este código
tableView.beginUpdates()
// add label text update code here
// label.numberOfLines = label.numberOfLines == 0 ? 1 : 0
tableView.endUpdates()
A continuación se muestra la referencia a esta solución con demo: