55 votes

Comment ajuster et faire en sorte que la largeur d'un UILabel s'adapte à la taille du texte ?

Dans mon projet, il y a une balise UILabel avec du texte. La taille de la police est de 16pt. Le contenu du texte change en fonction de différents cas. J'espère qu'il peut ajuster automatiquement la largeur de la UILabel pour s'adapter à la largeur totale des textes sans les étirer.

Est-ce possible ?

114voto

William Jockusch Points 9000

Cela suppose que vous avez déjà défini la police :

label.text = @"some text";
[label sizeToFit];

Vous devrez également définir une largeur maximale et indiquer à votre programme ce qu'il faut faire si sizeToFit vous donne une largeur supérieure à ce maximum.

3 votes

La méthode sizeToFit est une méthode de UIView.

58 votes

Comment définir une largeur maximale ?

9 votes

Le nombre de lignes doit être de 1 pour que la largeur s'ajuste. Si c'est 0, cela ajuste la hauteur. Notez également que cela semble seulement faire grandir le UILabel, donc assurez-vous qu'il est moins large dans l'IB que tout le texte que vous utiliserez.

21voto

Md. Abdul Munim Points 936

Voici comment faire, supposez que le messageLabel suivant est l'étiquette sur laquelle vous voulez avoir l'effet désiré. Maintenant, essayez ces simples lignes de code :

    // Définir la contrainte de largeur pour l'étiquette ; c'est en fait la largeur de votre UILabel
    CGFloat constrainedWidth = 240.0f;
    // Calculer l'espace pour la chaîne spécifiée
    CGSize sizeOfText = [yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
    UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)];
    messageLabel.text = yourText;
    messageLabel.numberOfLines = 0;// Cela rendra l'étiquette multiligne

7 votes

C'est en fait une très bonne réponse... Juste pas pour cette question spécifique! Cette réponse fonctionne bien lorsque vous voulez ajuster automatiquement la hauteur d'un UILabel tout en maintenant une largeur fixe. C'est en fait ce que je cherchais quand je suis tombé sur cette page. J'aimerais voter pour votre réponse... mais elle ne répond pas à la question posée. Bonne solution néanmoins et aidera probablement d'autres personnes qui tombent sur cette page.

1 votes

Merci jon! En fait, je cherchais également cette solution et par hasard, j'ai réussi à le faire, puis j'ai pensé que je devrais le partager ici. :) Au fait, ce qui s'est exactement passé cette fois, c'est que je n'ai pas bien remarqué la question, donc j'ai fait une erreur, je pense. Désolé pour cela, et content que cela t'ait aidé :D

0 votes

Pouvez-vous poster quelque chose de similaire pour iOS 8 ?

14voto

Vikas Pandey Points 205
NSString *txt1=@"Je suis ici.";
CGSize stringsize1 = [txt1 sizeWithFont:[UIFont systemFontOfSize:14]]; 
[label setFrame:CGRectMake(x,y,stringsize1.width,hieght)];
[label setText:txt1];

7voto

Michal Points 3353

Je vois trois options ici.

Premièrement, agrandissez la taille de l'étiquette suffisamment pour contenir n'importe quel texte. C'est le plus simple, mais cela ne fonctionne pas toujours bien - cela dépend des vues environnantes.

Deuxièmement, l'étiquette peut adapter la taille de la police pour un texte plus long (propriété adjustsFontSizeToFitWidth). Ce n'est souvent pas souhaitable, les polices différentes dans les éléments peuvent sembler moches.

La dernière option consiste à redimensionner programmation l'étiquette en fonction du texte qu'elle contient actuellement. Pour calculer la taille requise pour contenir le texte avec la police actuelle, utilisez quelque chose comme ceci :

CGSize textSize = [[someLabel text] sizeWithFont:[someLabel font] forWidth:someLabel.bounds.size.width lineBreakMode:UILineBreakModeWordWrap];

0 votes

Si nous utilisons UILineBreakModeWordWrap, nous pouvons entrer plusieurs lignes sur UILabel. Comment puis-je définir l'espace entre deux lignes ?

3voto

dheeru Points 189

Si vous avez déjà défini votre police et sa taille et si vous avez déjà défini votre cadre, essayez d'utiliser les instructions suivantes pour ces deux conditions courantes :

if (label.text.length > maxCharPerLine) [label setNumberOfLines:0]; // lignes infinies
else [label setNumberOfLines:1]; // une seule ligne

// Ajustez la taille de votre police pour qu'elle s'adapte à la largeur souhaitée.
[label setAdjustsFontSizeToFitWidth:YES];

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