2012-08-16 8 views
8

Mi texto tiene dos líneas de longitud en modo retrato. Cuando cambio al modo horizontal, cabe en una sola línea. Estoy usando celdas de tableview estáticas a través de un guión gráfico; ¿Cómo puedo cambiar el tamaño de la fila para que quede bien ajustada?Altura dinámica para celdas de tablas estáticas con etiquetas envolventes?

La pantalla es una pantalla de inicio de sesión.

  • La primera celda contiene un poco de texto explicación
  • El segundo es un campo de texto para introducir el nombre de cuenta
  • El tercero es un campo de texto seguro para introducir la contraseña
  • El cuarto (y último) la celda contiene el botón de inicio de sesión. La tecla de retorno del teclado envía el formulario o cambia el enfoque según sea apropiado
+0

Comprobar lo siguiente para una mejor solución en Swift http://stackoverflow.com/ preguntas/30450434/figure-out-size-of-uilabel-based-on-string-in-swift – David

+0

No es el mismo problema. –

Respuesta

9

Uso UITableView's heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int topPadding = 10; 
    int bottomPadding = 10; 
    float landscapeWidth = 400; 
    float portraitWidth = 300; 

    UIFont *font = [UIFont fontWithName:@"Arial" size:22]; 

    //This is for first cell only if you want for all then remove below condition 
    if (indexPath.row == 0) // for cell with dynamic height 
    { 
     NSString *strText = [[arrTexts objectAtIndex:indexPath.row]; // filling text in label 
    if(landscape)//depends on orientation 
    { 
     CGSize maximumSize = CGSizeMake(landscapeWidth, MAXFLOAT); // change width and height to your requirement 
    } 
    else //protrait 
    { 
     CGSize maximumSize = CGSizeMake(portraitWidth, MAXFLOAT); // change width and height to your requirement 
    } 

    //dynamic height of string depending on given width to fit 
    CGSize textSize = CGSizeZero; 
    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0") 
    { 
     NSMutableParagraphStyle *pstyle = [NSMutableParagraphStyle new]; 
     pstyle.lineBreakMode = NSLineBreakByWordWrapping; 

     textSize = [[strText boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName :font,NSParagraphStyleAttributeName:[pstyle copy]} context:nil] size]; 
    } 
    else // < (iOS 7.0) 
    { 
     textSize = [strText sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping] 
    } 

    return (topPadding+textSize.height+bottomPadding) // caculate on your bases as u have string height 
    } 
    else 
    { 
     // return height from the storyboard 
     return [super tableView:tableView heightForRowAtIndexPath:indexPath]; 
    } 
} 

EDITAR: Añadido por support para > and < ios7 y como sizeWithFont método está en desuso en iOS 7.0

+0

Si hago esto, necesito controlar manualmente la altura de cada celda en lugar de solo la primera, ¿correcto? (Eso no es horrible, solo quiero que quede claro.) –

+0

verifique la respuesta editada. –

+0

Gracias. Supuse que esta llamada no funcionaría con guiones gráficos + celdas estáticas, pero he verificado y tienes toda la razón. –

8

He tenido éxito con una implementación un poco más simple. Mientras su vista de tabla estática tiene restricciones apropiadas en las células, se puede pedir al sistema que el tamaño por usted:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    let cell = self.tableView(self.tableView, cellForRowAtIndexPath: indexPath) 
    let height = ceil(cell.systemLayoutSizeFittingSize(CGSizeMake(self.tableView.bounds.size.width, 1), withHorizontalFittingPriority: 1000, verticalFittingPriority: 1).height) 
    return height 
} 
+1

Esta era una pregunta muy antigua. En el iOS moderno si sus restricciones son correctas y usted agregue una función de estimación que devuelva 'UITableViewAutomaticDimension', ni siquiera necesita escribir el método de altura. :) –

+2

Esta respuesta puede ser relevante. Me encontré con instancias en iOS 9 donde una vista de tabla estática con restricciones adecuadas no cambiará el tamaño dinámicamente correctamente después de cambiar el texto de una etiqueta. El problema anterior resuelve el problema, mientras que UITableViewAutomaticDimension no lo hace. –

+0

Eso es interesante, gracias. :) –

Cuestiones relacionadas