40 votes

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 d'affichage.

Un exemple précis:

Le texte est ceci: "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);

Cela renvoie: 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.)

Ce doit renvoyer exactement de 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.

Ainsi, 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. Ce thème 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?

37voto

Jaanus Points 8609

Bien sûr, la solution est évidente 30 secondes après l'affichage. Peut-être utile à d'autres aussi...

La taille en sizeWithFont: a été correct. Les tailles j'ai calculé de la façon décrite ci-dessus ont été incorrect, car [label sizeToFit] réduit la largeur de l'étiquette de l'image. Lors des appels suivants du même code, il a commencé avec le cadre qui ont déjà été réduits.

La solution était tout simplement de réinitialiser l'image width pour un bien connu largeur avant de dimensionnement pour s'adapter:

CGRect labelFrame = label.frame;
labelFrame.size.width = 310;
label.frame = labelFrame;
[label sizeToFit];

12voto

Oleg Points 327

Pour multiligne étiquettes que vous avez besoin de le configurer

cell.textLabel.numberOfLines = 0;

et puis

[cell.textLabel sizeToFit];

Mais pour la jolie vue que vous avez besoin d'ajouter un peu de rembourrage pixels. Et votre application sera génial!

6voto

Aswathi Points 41
 titleSize = [title sizeWithFont:[UIFont systemFontOfSize:(CGFloat)17.0]
                                constrainedToSize:CGSizeMake(280, 2000)
                                    lineBreakMode:NSLineBreakByWordWrapping];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X