web-dev-qa-db-fra.com

La méthode UILabel sizeToFit ne fonctionne pas correctement

J'essaie d'afficher une longue partie de texte à l'intérieur d'un UILabel sur une seule ligne. L'UILabel est une sous-vue d'UIScrollView afin que je puisse faire défiler et voir l'intégralité de l'UILabel.

Mon problème est que la méthode sizeToFit ne fonctionne que partiellement.

textLabel.attributedText = attributedString;
textLabel.numberOfLines = 1;
[textLabel sizeToFit];
textScrollView.contentSize = CGSizeMake(textLabel.frame.size.width, textLabel.frame.size.height);

La taille du contenu UIScrollView est suffisamment grande pour afficher l'intégralité de UILable, mais pour une ligne comme:

je vais donc essayer de partager certains d'entre eux ici de temps en temps. "

L'UILabel montre:

donc je vais essayer de partager som ...

Qu'est-ce que je fais mal?

20
YogevSitton

Il s'avère que le code est très bien - mais la mise en page automatique a été vérifiée. Décoché - tout fonctionne très bien ...

28
YogevSitton

Si vous souhaitez y parvenir avec la mise en page automatique activée, c'est simple. Assurez-vous simplement d'ajouter numberOfLines

textLabel.adjustsFontSizeToFitWidth = YES;
textLabel.numberOfLines = 0;
20
Joe Barbour

Étonnamment, si vous n'avez pas imposé de contrainte sur la largeur de l'étiquette, cela fonctionnerait:

[textLabel.superview layoutSubviews];

J'ai appris cela par essais et erreurs.

4
Maxthon Chan

essayer

textLabel.adjustsFontSizeToFitWidth  = YES;
textLabel.minimumFontScale      =  0.5;  
2
Shob-Z

La raison la plus courante pour laquelle sizeToFit ne fonctionne pas correctement est que UILabel n'a pas de contraintes de mise en page automatique, par exemple si vous comptez implicitement sur la position d'affichage restant fixe par rapport au coin supérieur gauche. L'ajout de toute contrainte (leader, top, centerY, n'importe quoi) le corrigera, probablement parce que cela entraînera l'appel de layoutSubviews à un moment donné, comme suggéré dans la réponse de Maxthon Chan.

1
Christopher Swasey

Étant donné que vous avez limité votre étiquette pour afficher une seule ligne de texte et tronquer le reste, il se comporte de la même manière

textLabel.attributedText = attributedString;
textLabel.numberOfLines = 0;
[textLabel sizeToFit];
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textScrollView.contentSize = CGSizeMake(textLabel.frame.size.width, textLabel.frame.size.height);

J'espère que cela vous aidera

0
Gaurav Rastogi