2009-07-21 18 views
7

Tengo UITableView (¡Agrupado!) Y necesito calcular la altura de dos estilos de celdas: UITableViewCellStyleDefault y UITableViewCellStyleValue2.heightForRowAtIndexPath para NSStrings más largos

Así es como lo hago por UITableViewCellStyleDefault:

CGSize textSize = {300.f, 200000.0f}; 
CGSize size = [myTextString1 sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap]; 
size.height += 30.0f; 
result = MAX(size.height, 44.0f); 

Y para UITableViewCellStyleValue2:

CGSize textSize = {207.f, 200000.0f}; 
CGSize size = [myTextString2 sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap]; 
size.height += 30.0f; 
result = MAX(size.height, 44.0f); 

Mi problema es que vuelvan alturas incorrectas y yo creo que es el textSize donde Yo uso números incorrectos. Con textos largos, la parte inferior se corta (generalmente solo una línea con algunas palabras), y para ambos CellStyles tienen un espaciado extraño arriba y debajo del texto en la celda.

Para UITableViewCellStyleValue2 Obtuve el tamaño del ancho (207.0f) para hacer que text.backgroundColor sea rojo y luego solo calcule el tamaño del cuadro. 300.0f ancho para UITableViewCellStyleDefault es lo grande que es la celda con .

¿Alguien sabe qué valores necesito usar para calcular correctamente el tamaño de un NSString y así obtener la altura adecuada para mis celdas?

Gracias

Respuesta

9

Aquí está el código que estoy usando para esto. Funciona como un encanto para un tipo de célula. Puede tener algunas partes útiles para su aplicación.

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { 
AppAppDelegate *appDelegate = (AppAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSString *Text = ([[appDelegate.myTextSectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"Text"]); 

    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; 
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); 
    CGSize labelSize = [Text sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 
    return labelSize.height + 15;} 
+1

Gracias. Terminé haciendo algo solo con las mismas líneas. Descubrí que tenía problemas con las células Value2, porque asumí que eran fontSize 14, mientras que en realidad son 15. Para su código, es posible que desee agregar: resultado = MAX (labelsize.height + 15 , 44.0f); Por si acaso, si la celda está siempre vacía o tiene menos de 2 líneas, la devolverá con una altura de fila mínima de 44.0 f, que es la normal. Si solo hay una línea, la hará más pequeña que 44.0f. – runmad

2

Al crear su celular, ¿está utilizando la misma fuente que el que se utiliza para medir?

Utilicé el tutorial en this page y todo funcionó para mí. Puede ser útil para usted también:

+0

Sí, uso el mismo tamaño y tipo de letra (negrita/negrita). Echaré un vistazo al enlace y veré si eso lo resuelve y te lo hago saber. – runmad

+0

¡Descubrí que no estaba usando la fuente correcta! Descubrí que tenía problemas con las células Value2, porque supuse que eran fontSize 14, mientras que en realidad son 15. El otro estilo de celda que necesitaba para jugar con la altura que agrega a la altura del texto. – runmad

2

Parece que ha descubierto que estaba utilizando un tamaño de texto incorrecto. Es posible que desee utilizar las propiedades font y lineBreakMode de la etiqueta para evitar este problema en el futuro, especialmente si las cambia en la celda más adelante. Además, por razones de legibilidad, evitaría agregar a la altura antes de devolver un número. En su lugar me gustaría probar algo como esto:

CGSize textSize = CGSizeMake(300.0, 1979); 
CGSize size = [ myTextString1 sizeWithFont:[[ cell textLabel ] font ] 
         constrainedToSize:textSize 
          lineBreakMode:[[ cell textLabel ] lineBreakMode ]]; 

result = MAX(size.height + 30, 44.0f); 

utilicé 1979 porque de acuerdo a la documentación, no se debe devolver valores mayores que 2009.

+0

Gracias. Sí, establecí algunas constantes para los tamaños de fuente, así que si la cambio para la celda, se actualizará en todas partes. – runmad

0

Cuando está trabajando para mí es calcular la constraintSize basado en la anchura de la vista de tabla:

CGSize constraintSize = CGSizeMake(tableView.frame.size.width * 0.6, 2009); 
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 
0

manera más fácil de hacer esto:

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

CGFloat result = 10.0f; 
if(indexPath.section == 1) // here i compare the sections 
{ 
    result = 400.0f; 
} 
return result; 
} 

Devuelve los valores según las secciones que tienes. Esto le dará alturas de fila personalizadas.

2

Si se desea calcular la altura adecuada para cellvalue2 se debe utilizar: [UIFont boldSystemFontOfSize:15.0f] y como linebreakmode: NSLineBreakByTruncatingTail

Si no se utiliza en negrita, el texto va a llenar correctamente pero perderá el relleno vertical correcta .

El resto de su cálculo es correcto.

Cuestiones relacionadas