2009-07-21 8 views
7

J'ai un UITableView (groupé!) Et besoin de calculer la hauteur de deux styles de cellules: UITableViewCellStyleDefault et UITableViewCellStyleValue2.heightForRowAtIndexPath pour NSStrings plus longs

Voilà comment je le fais pour 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); 

Et pour 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); 

Ma question, il leur dit de revenir hauteurs incorrectes et je pense qu'il est le textSize où J'utilise des nombres incorrects. Avec les textes longs, la partie inférieure est raccourcie (généralement une ligne avec quelques mots), et pour les deux CellStyles, ils ont un espacement étrange au-dessus et en dessous du texte de la cellule.

Pour UITableViewCellStyleValue2 J'ai obtenu la taille de la largeur (207.0f) de rendre le text.backgroundColor rouge, puis de calculer la taille de la boîte. 300.0f largeur pour UITableViewCellStyleDefault est la taille de la cellule avec .

Est-ce que quelqu'un sait quelles valeurs je dois utiliser pour calculer correctement la taille d'un NSString et obtenir ainsi la taille appropriée pour mes cellules?

Merci

Répondre

9

Voici le code que j'utilise pour cela. Cela fonctionne comme un charme pour un type de cellule. Il peut avoir des parties utiles pour votre application.

- (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

Merci. J'ai fini par faire quelque chose de seul avec les mêmes lignes. J'ai découvert que j'avais des problèmes avec les cellules Value2, parce que je supposais qu'ils étaient fontSize 14, alors qu'ils sont en réalité 15. Pour votre code, vous pouvez ajouter: résultat = MAX (labelsize.height + 15 44.0f); Juste au cas où la cellule est toujours vide ou moins de 2 lignes, elle retournera avec une hauteur de ligne minimale de 44.0f, ce qui est normal. S'il n'y a qu'une seule ligne, cela le rendra plus petit que 44.0f. – runmad

2

Lorsque vous créez votre cellule, vous utilisez la même police que celui que vous utilisez pour mesurer?

J'ai utilisé le tutoriel sur this page et tout a fonctionné pour moi. Cela peut aussi vous être utile:

+0

Oui, j'utilise la même taille de police et le même type (gras/non gras). Je vais jeter un coup d'oeil sur le lien et voir si cela résout et vous le faire savoir. – runmad

+0

J'ai découvert que je n'utilisais pas la bonne police! J'ai découvert que j'avais des problèmes avec les cellules Value2, parce que je supposais qu'ils étaient fontSize 14, alors qu'ils sont en réalité 15. L'autre style de cellule dont j'avais besoin pour jouer avec la hauteur qu'il ajoute à la hauteur du texte. – runmad

2

Il semble que vous ayez compris que vous utilisiez la mauvaise taille de texte. Vous pouvez utiliser simplement les propriétés font et lineBreakMode de l'étiquette pour éviter ce problème dans le futur, surtout si vous les changez dans la cellule ultérieurement. Aussi, pour des raisons de lisibilité, j'éviterais d'ajouter à la hauteur avant de retourner un nombre. Au lieu de cela, je vais essayer quelque chose comme ceci:

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); 

I utilisé 1979 parce que, selon la documentation, on ne doit pas retourner des valeurs supérieures à 2009.

+0

Merci. Oui, j'ai mis quelques constantes pour les tailles de police, donc si je le change pour la cellule, ça va mettre à jour partout. – runmad

0

Quand travaille pour moi est de calculer la constraintSize sur la base la largeur de la vue de la table:

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

meilleure façon de faire ceci:

- (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; 
} 

Renvoyez les valeurs en fonction des sections que vous avez. Cela vous donnera des hauteurs de rangées personnalisées.

2

Si vous voulez calculer la hauteur appropriée pour cellvalue2 vous devez utiliser: [UIFont boldSystemFontOfSize:15.0f] et comme lineBreakMode: NSLineBreakByTruncatingTail

Si vous n'utilisez pas gras, le texte correctement remplir, mais vous perdrez le rembourrage vertical correct .

Le reste de votre calcul est correct.

Questions connexes