web-dev-qa-db-fra.com

Ajuster le texte dans UILabel

Voici mon code

 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)];
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.textColor.font = [UIFont fontWithName:@"Verdana" size:30];
    label.text = @"A very long string";
     etc...

Le problème est que la police est grande et ne peut pas tenir dans l'étiquette. Il affiche simplement "A very"

Que faire si tout le texte à afficher. j'ai essayé

label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

Mais ça ne marche pas pour moi. Je veux le faire par programme.

//ÉDITER

CGRect frame = CGRectMake(10, 50, 300, 50);
    NSString *labelString = @"Players.";

    UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame];
    howManyUsersLabel.textAlignment = UITextAlignmentCenter;
    howManyUsersLabel.backgroundColor = [UIColor clearColor];
    howManyUsersLabel.textColor = [UIColor whiteColor];
    howManyUsersLabel.adjustsFontSizeToFitWidth = NO;
    howManyUsersLabel.numberOfLines = 0;

    CGFloat fontSize = 30;
    while (fontSize > 0.0)
    {
        CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];

        if (size.height <= frame.size.height) break;
        fontSize -= 1.0;
        NSLog(@"test");
    }

    howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];
38
objlv

Je pense que vous avez juste besoin d'ajouter ceci:

label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;

Ensuite, le texte sera automatiquement redimensionné pour s'adapter à l'étiquette.

Notez cependant que cela ne fonctionnera vraiment que si label.numberOfLines = 1, de sorte que le texte se trouve sur une seule ligne.

Si vous avez besoin que le texte soit enroulé sur plusieurs lignes mais qu'il soit toujours réduit pour s'adapter, la solution est plus complexe. Pour ce faire, vous devez calculer la taille rendue du texte, puis la réduire en boucle, comme suit:

NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;

CGFloat fontSize = 30;
while (fontSize > 0.0)
{
    CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];

    if (size.height <= labelRect.size.height) break;

    fontSize -= 1.0;
}

//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];

Cela réduit simplement la taille de la police jusqu'à ce qu'elle corresponde à l'étiquette.

MISE À JOUR:

À partir d'iOS7, le texte multiligne se réduira également automatiquement lorsque adjustsFontSizeToFitWidth = YES, la deuxième partie de cette réponse n'est donc plus nécessaire (sauf si vous prenez toujours en charge iOS 6 et versions antérieures).

89
Nick Lockwood

Enfin, j'ai une solution pour le problème d'alignement du texte en langue arabe, vous faites comme ceci:

    label.text = @"هذا هو نص طويل جدا";
    label.textAlignment = NSTextAlignmentNatural;

    CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
    label.height = size.height;
3
Maishi Wadhuwani
[UILabel sizeToFit];

Cela fonctionnera pour votre problème.

1
Maishi Wadhuwani

Swift avec iOS 9

let maxFontSize: CGFloat = 40
let minFontSize: CGFloat = 10

label.font = UIFont(name: label.font.fontName, size: maxFontSize)!
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = minFontSize/maxFontSize

Cela n'augmente pas la taille de la police pour remplir l'étiquette. Il commence simplement par la taille maximale et diminue au besoin jusqu'au minimum. Cela suppose également que le nombre de lignes est 1.

0
Suragch
CGRect titleRect        = CGRectMake(10, 50, 300, 50);

UILabel *textTitleView  = [[UILabel alloc] initWithFrame:titleRect];

textTitleView.numberOfLines = 3  //for multiple lines;

textTitleView.lineBreakMode = UILineBreakModeWordWrap;

[UIFont fontWithName:@"Verdana" size:30];

textTitleView.text          = @"your text";
0
Piyush Kashyap

Interface Builder vous permet de le faire maintenant.

  1. Dans UILabel, sous Autoshrink, sélectionnez "Minimum Font Size" au lieu de "Fixed Font Size".
  2. Définissez Taille de police minimale pour qu'il soit raisonnable, comme 8.
  3. Vous pouvez également cocher la case "Tighten Letter Spacing".

Alternativement, vous pouvez le faire par programme:

label.adjustsFontSizeToFitWidth = YES;
0
Jeffrey Sun

Tout semble cassé dans iOS 8 (probablement iOS 7 aussi).

Solution:

-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont {
    UIFont* returnFont = seedFont;
    CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];

    while(stringSize.width > rect.size.width){
        returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
        stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
    }

    return returnFont;
}

Assurez-vous de ne pas essayer d'utiliser label.adjustsFontSizeToFitWidth = YES sinon cela deviendra vraiment confus et la nouvelle taille ne fonctionnera pas correctement.

0
brandonscript