41 votes

UILabel de sizeToFit/sizeThatFits ignorer la numberoflines propriété

Problème: Déterminer la taille (nombre de lignes), un UILabel besoins, en supposant que la largeur de 300 px. La chaîne est plus longue, j'ai donc mis le lineBreakMode à UILineBreakModeWordWrap et invoqué sizeThatFits pour essayer d'en déterminer la taille. Mais il donne une largeur de 457 px sur une seule ligne, plutôt que de l'attendre 300px en deux lignes.

Veuillez voir:

CGSize available = CGSizeMake(300, INFINITY);
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 400)] autorelease];
label.text = title;
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont fontWithName:kBoldFont size:kTitleFontSize];
label.numberOfLines = 3;
CGSize sizedtoFit = [label sizeThatFits:available];

Mais je trouve que l'sizedtoFit variable a une largeur de 457 pixels et une hauteur de 22 px, et l'INTERFACE utilisateur affiche une seule ligne avec la zone de texte. Je m'attends à une largeur de 300 pixels et une hauteur de 44 px pour deux lignes.

Le UILabel doc pour numberoflines dit:

Lorsque le récepteur est redimensionnée à l'aide de la sizeToFit méthode, redimensionnement prend en compte la valeur stockée dans cette propriété. Par exemple, si cette propriété est définie sur 3, la sizeToFit méthode redimensionne le récepteur de sorte qu'il est assez grand pour afficher trois lignes de texte.

J'ai essayé diverses combinaisons de:

  1. En passant CGRectZero à la fonction init, en passant 300x400 ou 300 x l'infini.
  2. Réglage de l'image après la création plutôt que de les passer à la fonction init.
  3. Invoquant [sizeToFit] et en espérant qu'il calcule la hauteur en supposant présent largeur, mais il ne le fait pas.
  4. L'appel de sizeToFit et puis l'appel de sizeThatFits.
  5. Invoquant layoutIfNeeded.

Aucun d'entre eux travaille. Ce que je fais mal, ou est-ce mauvais d'un bug où la documentation et la mise en œuvre du cadre ne sont pas d'accord? Merci.

29voto

Alex Zak Points 669

J'ai eu le même problème, la taille qui s'adapte tout simplement ignore la taille... /: J'ai fini par utiliser:

CGRect textSize = [UILabel textRectForBounds:CGRectMake(0, 0, 300, CGFLOAT_MAX) 
                      limitedToNumberOfLines:3];

Fonctionne comme un charme... :)

La documentation dit qu'il ne faut pas l'appeler directement, mais je l'ai utilisé pendant un certain temps, avec approuvés soumis applications, et tout est tout simplement génial... :)

7voto

Ian L Points 3822

Avez-vous essayé l' sizeWithFont: constrainedToSize: lineBreakMode: méthode?

Par exemple:

CGSize sizeToFit = [title sizeWithFont:label.font constrainedToSize:label.frame.size lineBreakMode:label.lineBreakMode];

3voto

auco Points 2663

J'ai trouvé Ian L répondent le mieux à l'aide d' -sizeWithFont:constrainedToSize:lineBreakMode:, malheureusement sizeWithFont: est obsolète sous iOS7.

C'est de cette façon sizeWithFont: œuvres pour un UILabel sous-classe dans iOS7:

NSRange range = NSMakeRange(0, self.attributedText.length); 
sizeToFit = [self.text boundingRectWithSize:self.bounds.size
                                    options:NSStringDrawingUsesLineFragmentOrigin 
                                 attributes:[self.attributedText 
                          attributesAtIndex:0 effectiveRange:&range] context:nil].size;

0voto

SadullahCeran Points 1560

Il n'y a pas de solution pour ios5 pour sizeToFit. Vous pouvez utiliser d'autres solutions comme sizeWithFont etc. Dans ios6, le problème est résolu. Cependant, j'ai cette solution de contournement pour mes solutions:

int lineCount = myLabel.numberOfLines;
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
myLabel.numberOfLines = lineCount;

Et il fonctionne. Attention, pour ma situation, de la largeur de mon label est fixe et que je n'ai besoin sizeToFit pour le réglage de la hauteur.

0voto

Amit Singh Points 3940

Je pense que vous obtenez des résultats inattendus parce que vous ne prenez pas en considération l' UILabel's de la police. Essayez les solutions suivantes:

UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 400)] autorelease];
label.text = title;
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont fontWithName:kBoldFont size:kTitleFontSize];
label.numberOfLines = 0;

CGSize size = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.frame.size.width,FLT_MAX) lineBreakMode:UILineBreakModeWordWrap ];
label.frame = CGRectMake(label.frame.origin.x,label.frame.origin.y,label.frame.size.width,size.height);

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