iphone - uitableviewcell - uitableviewautomaticdimension not working
¿Cómo obtener un alto de fila UITableView para que se ajuste automáticamente al tamaño de UITableViewCell? (5)
A partir de iOS 8, tiene la opción de trabajar con celdas de auto-tamaño especificando estas opciones en su vista de tabla:
tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableView.automaticDimension
Esto funcionará siempre que el sistema pueda calcular las filas en función de las restricciones o el contenido existentes. ¡Tenga cuidado de que si configura automaticDimension no se llamará heightForRowAtIndexPath!
Algunas veces, con datos más complejos, algunas celdas pueden calcularse automáticamente, pero otras necesitan una lógica de cálculo de altura específica. En este caso, solo debe configurar el valor estimadoRowHeight y luego implementar cellForRowAtIndexPath con lógica automática para las celdas que pueden funcionar correctamente:
// Set the estimated row height in viewDidLoad, but *not* automatic dimension!
override func viewDidLoad() {
// other viewDidLoad stuff...
tableView.estimatedRowHeight = 85.0
tableView.delegate = self
}
// Then implement heightForRowAtIndexPath delegate method
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if theAutomaticCalculationWorksForThisRow {
return UITableView.automaticDimension
} else {
// Calculate row height based on custom logic...
let rowHeight = 85.0
return rowHeight
}
}
¿Cómo obtener un alto de fila de UITableView para que se ajuste automáticamente al tamaño de UITableViewCell?
Asumiendo que estoy creando el UITableViewCell en Interface Builder, y su altura es mayor que el tamaño estándar, ¿cómo puedo hacer que la altura de la fila de UITableView se ajuste automáticamente? (es decir, en lugar de tener que medir manualmente la altura en el constructor de interfaces y luego programarlo)
En la xib con su vista de tabla, puede agregar un objeto de celda y vincularlo a un IBOutlet en su código fuente. No lo usarás en ningún lugar, solo usarás esto para obtener la altura de la celda.
Luego, en tableView:heightForRowAtIndexPath:
puedes usar ese objeto para obtener la altura. No es 100% automático, pero al menos esto le ahorra la molestia de actualizar manualmente su código fuente cuando realiza cambios en la vista de celda en IB.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return myDummyCellObject.bounds.size.height;
}
Si todas las filas son del mismo tipo (celda), puede configurar la propiedad tableView.rowHeight
programación en lugar de implementar el método de delegado anterior. Depende de tu escenario.
Ah, y asegúrate de no olvidar lanzar myDummyCellObject en -dealloc
.
http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ es un excelente tutorial para esto.
El bit principal es
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
// Get the text so we can measure it
NSString *text = [items objectAtIndex:[indexPath row]];
// Get a CGSize for the width and, effectively, unlimited height
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
// Get the size of the text given the CGSize we just made as a constraint
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
// Get the height of our measurement, with a minimum of 44 (standard cell size)
CGFloat height = MAX(size.height, 44.0f);
// return the height, with a bit of extra padding in
return height + (CELL_CONTENT_MARGIN * 2);
}
Si todas las celdas son iguales, establezca la propiedad UITableView
en UITableView
al tamaño de su celda. Si todos son diferentes según el contenido, tendrá que implementar -tableView:heightForRowAtIndexPath:
y calcular la altura de cada fila según su origen de datos.
self.tableView.estimatedRowHeight = 65.0; // Estimate the height you want
self.tableView.rowHeight = UITableViewAutomaticDimension; // auto change heights for multiple lines cells.
Al implementar el método requerido UITableViewDataSource:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = [self.todoArray objectAtIndex:indexPath.row];
cell.textLabel.numberOfLines = 0; // allow multiple lines showing up
return cell;
}