2011-02-09 11 views
8

¿Cómo puedo hacer que la segunda celda se expanda para ajustarse al texto en lugar de escalar el texto? ¿Existe alguna forma de hacerlo en iOS o tendré que buscar alguna solución casera? Si mira en la aplicación Contactos de iOS, hay un cuadro como este para Dirección. No puedo encontrar cómo implementar esto sin embargo.¿Cómo creo una celda de tabla multilínea en iOS?

Table screenshot


Para cualquiera que quiera lograr esto en el futuro, aquí está el código para mi solución:

archivo de cabecera: archivo

#define FONT_SIZE 22.0f 
#define CELL_CONTENT_WIDTH 320.0f 
#define CELL_CONTENT_MARGIN 5.0f 

APLICACIÓN:

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

    if (indexPath.section == 0 && indexPath.row == 1) { 

     NSString *text = [atmAnnotation address]; 

     CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

     CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
     NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width); 

     CGFloat height = MAX(size.height, 44.0f); 

     return height + (CELL_CONTENT_MARGIN * 2); 

    } 
    return 44.0f; 
} 

Aquí hay una captura de pantalla del resultado:

UITableView fixed

Respuesta

5

Lamentablemente, tendrá que implementar esta característica usted mismo. Hay una variedad de métodos y devoluciones de llamada que necesita usar para calcular la altura de las filas y las etiquetas. Si necesita ayuda para comenzar, puedo modificar esta respuesta para incluir algún código de muestra. De lo contrario, estoy seguro de que hay algunas preguntas relacionadas aquí en SO o Google que pueden ayudarlo a comenzar. En resumen, sin embargo:

  • determinar la altura de la fila en el método de UITableViewDelegate-tableView:heightForRowAtIndexPath:. Probablemente necesite usar el NSString UIKit Addition methods para calcular qué tan alta será su cuerda con un tamaño de letra determinado, etc. Regrese la altura correcta de este método delegado.
  • Asegúrese de que su etiqueta (ya sea en IB o configurada mediante programación) está configurada para usar varias líneas. Si establece numberOfLines en 0, la etiqueta usará tantas líneas como sea necesario.
  • En su implementación UITableViewDataSource de -tableView:cellForRowAtIndexPath:, deberá usar la misma lógica que antes para determinar el marco de sus etiquetas. Establezca el texto que desea, luego cambie el marco para que la etiqueta sea lo suficientemente alta como para que apenas se ajuste a todo el texto.
1

implementar:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

delegado en su mesa. Para las diferentes filas y secciones en indexPath pasado, devuelva una altura diferente para adaptarse a su etiqueta.

Asegúrate de que "Ajustar para ajustar" para la etiqueta en IB no está marcada (propiedad adjustsFontSizeToFitWidth si lo haces usando el código).

1

Donde tenga la dirección como detailTextLabel, use un UILabel que admita tantas líneas como necesite, para una dirección, 3 debería ser suficiente. Junto con la respuesta Paul Bently's, deberías estar listo.

0

Acabo de encontrarme con este mismo problema. Encontré una solución alternativa que no requiere tanto hardcoding, y le permite hacer modificaciones a la etiqueta en Interface Builder que se reflejará en el cálculo de la altura.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0 && indexPath.row == 1) { 
     NSString *text = [atmAnnotation address]; 
     UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

     cell.textLabel.text = text; 
     [cell.textLabel sizeToFit]; 

     CGFloat height = MAX(44, cell.textLabel.bounds.size.height); 

     return height + CELL_CONTENT_MARGIN * 2; 
    } 

    return 44.0f; 
} 

El único inconveniente es que esto hará que algunas asignaciones UITableViewCell temporales adicionales, pero la vista de tabla de inmediato recuperarlos, así que no creo que debería ser un gran problema.

Cuestiones relacionadas