Le calcul de texte multiligne hauteur pour UILabel/UITableViewCell: des résultats différents lors du calcul de vs réel de dessin

Ce thème général a été demandé à de multiples reprises: comment rendre UITableViewCells avec des quantités variables de texte et donc de hauteur variable. La réponse canonique est: calcul de la hauteur de table view controller délégué dans heightForRowAtIndexPath à l'aide de sizeWithFont:constrainedToSize:lineBreakMode:. Plus tard, la cellule pénètre, et que vous utilisez quelque chose comme [label sizeToFit] si nécessaire, et tout fonctionne comme par magie.

Mon problème: je suis d'habillage pour certaines cellules, car sizeWithFont: retourne différentes dimensions du dessin proprement.

Un exemple précis:

Le texte, le voici: "les Gens oublient que @BillGates avait une sexy 1/4-pouce d'épaisseur de l'ardoise en 1993 de NEC. Quoi qu'il arrive cette semaine ne sera PAS sur le matériel!"

CGSize theSize = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(310.0f, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap];
NSLog(@"calculated size for %@: %f, %f",text, theSize.width, theSize.height);

Ce retourne: 306.000000, 84.000000. (I. e 4 lignes avec 17px de la police et de 4px linespacing, 21px tête.) Bon.

Cependant, plus tard, quand en fait le dessin de la cellule:

label = (UILabel *)[cell viewWithTag:3];
label.text = [NSString stringWithFormat:@"%@", text];
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont systemFontOfSize:17.0f];
CGSize labelSize;   
labelSize = label.frame.size;
NSLog(@"label size before resizing: %f, %f", labelSize.width, labelSize.height);
[label sizeToFit];
labelSize = label.frame.size;
NSLog(@"label size after resizing: %f, %f for text %@", labelSize.width, labelSize.height,text);

(UILabel est chargé dans le cadre de UITableViewCell de PLUME. IB je l'ai mis à 310px de large.)

Cela doit revenir exactement la même taille que ci-dessus. Au lieu de cela, je reçois 281.000000, 105.000000 que les dimensions après sizeToFit appel. Il est maintenant 5 lignes au moment du dessin au lieu de 4, et le texte déborde, je vois l'effet de l'INTERFACE utilisateur.

Donc, pour le même texte, je reçois deux dimensions différentes calculé, et ne peut pas le comprendre. Est-il quelque chose à propos de UILabel? A-t-elle intérieure de marges? Cela continue à se produire pour certains textes, mais pas d'autres, et je n'ai pas retracé il à quelque chose de particulier sur les chaînes; semble aléatoire. Cette rubrique souligne qu'il existe deux traitement de passe: calcul de la hauteur vs réel de dessin. Ceci est cohérent avec ce que je vois. Mais je ne comprends pas exactement ce qui se passe ou comment résoudre le problème.

La question: pourquoi suis-je en voyant deux différents calculé tailles, et comment puis-je résoudre ce problème?

InformationsquelleAutor Jaanus | 2010-01-25