UILabel-étiquette de taille automatique pour s'adapter au texte?

Est-il possible de redimensionner automatiquement la boîte/les limites UILabel pour s'adapter au texte contenu? (Je me fiche si elle finit plus grande que l'affichage)

Donc, si un utilisateur entre "bonjour" ou "mon nom est vraiment long, je veux qu'il fit dans cette zone", il n'est jamais tronqué et l'étiquette est "élargi" en conséquence?

130
demandé sur Suragch 2012-01-10 03:56:42

14 réponses

Veuillez vérifier mon essentiel où j'ai créé une catégorie pour UILabel pour quelque chose de très similaire, ma catégorie permet à un UILabel d'étirer sa hauteur pour afficher tout le contenu: https://gist.github.com/1005520

Ou consultez ce post: https://stackoverflow.com/a/7242981/662605

Cela étirerait la hauteur, mais vous pouvez la changer facilement pour travailler dans l'autre sens et étirer la largeur avec quelque chose comme ça, ce qui est je crois ce que vous voulez faire:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

Vous pouvez plus simplement utiliser la méthode sizeToFit disponible dans la classe UIView, mais définissez le nombre de lignes sur 1 pour être sûr.


Mise à jour IOS 6

Si vous utilisez AutoLayout, vous avez une solution intégrée. En définissant le nombre de lignes sur 0, le framework redimensionne votre étiquette de manière appropriée (en ajoutant plus de hauteur) pour s'adapter à votre texte.


Mise à jour IOS 8

sizeWithFont: est obsolète donc utilisez sizeWithAttributes: à la place:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}
96
répondu Daniel 2018-07-11 11:30:25

L'utilisation de [label sizeToFit]; permet d'obtenir le même résultat à partir de la catégorie Daniels.

Bien que je recommande d'utiliser autolayout et de laisser l'étiquette se redimensionner en fonction des contraintes.

69
répondu Guilherme Torres Castro 2016-06-28 17:40:53

Si nous voulons que {[0] } rétrécit et se développe en fonction de la taille du texte, alors storyboard avec autolayout est la meilleure option. Voici les étapes pour y parvenir

Étapes

  1. Mettez UILabel dans le contrôleur de vue et placez-le où vous voulez. Mettez également 0 pour numberOfLines propriété de UILabel.

  2. Donnez-lui une contrainte de broche D'espace supérieure, principale et arrière.

entrez la description de l'image ici

  1. maintenant, il va donner un avertissement, cliquez sur le jaune flèche.

entrez la description de l'image ici

  1. Cliquez sur Update Frame et cliquez sur Fix Misplacement. Maintenant, ce UILabel va rétrécir si le texte est moins et se développer si le texte est plus.
29
répondu Yogesh Suthar 2015-06-10 11:38:49

Ce n'est pas aussi compliqué que certaines des autres réponses le font.

entrez la description de l'image ici

Épingler les bords gauche et supérieur

Il suffit D'utiliser la mise en page automatique pour ajouter des contraintes pour épingler les côtés gauche et supérieur de l'étiquette.

entrez la description de l'image ici

Après cela, il sera automatiquement redimensionné.

Notes

  • n'ajoutez pas de contraintes pour la largeur et la hauteur. Les étiquettes ont une taille intrinsèque en fonction de leur contenu textuel.
  • Merci à cette réponse pour de l'aide.
  • Pas besoin de définir sizeToFit lors de l'utilisation de la mise en page automatique. Mon code complet pour l'exemple de projet est ici:

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
    
  • si vous voulez que votre étiquette soit enroulée, définissez le nombre de lignes sur 0 dans IB et ajoutez myLabel.preferredMaxLayoutWidth = 150 // or whatever dans le code. (J'ai également épinglé mon bouton au bas de l'étiquette afin qu'il se déplace vers le bas lorsque la hauteur de l'étiquette augmente.)

entrez la description de l'image ici

  • si vous recherchez des étiquettes de dimensionnement dynamique à l'intérieur d'un UITableViewCell, puis voir cette réponse.

entrez la description de l'image ici

19
répondu Suragch 2017-05-23 12:03:02

Utilisez [label sizeToFit]; pour ajuster le texte dans UILabel

9
répondu Gaurav Gilani 2014-07-21 08:18:20

J'ai créé quelques méthodes basées sur la réponse de Daniel ci-dessus.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}
5
répondu Doug Baker 2013-01-26 16:28:21
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

C'est la méthode de la catégorie. Vous devez d'abord définir le texte, puis appeler cette méthode pour ajuster la hauteur D'UILabel.

3
répondu Kaijay Lu 2012-01-10 02:02:07

Vous pouvez dimensionner votre étiquette en fonction du texte et d'autres contrôles connexes en utilisant deux façons-

  1. Pour iOS 7.0 et supérieur

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;
    

Avant iOS 7.0, cela pouvait être utilisé pour calculer la taille de l'Étiquette

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

/ / recadrer d'autres contrôles basés sur labelTextHeight

CGFloat labelTextHeight = labelTextSize.height;
  1. Si vous ne voulez pas calculer la taille du texte de l'étiquette, vous pouvez utiliser -sizeToFit sur l'instance de UILabel as -

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text
    

// après cela, vous pouvez récupère le cadre d'étiquette pour recadrer d'autres contrôles connexes

2
répondu vijeesh 2015-06-10 11:38:10
  1. ajoute des contraintes manquantes dans le storyboard.
  2. Sélectionnez UILabel dans storyboard et définissez les attributs "Line" sur 0.
  3. Ref sortie le UILabel à Contrôleur.h avec id: label
  4. Contrôleur.m et Ajouter [label sizeToFit]; dans viewDidLoad
2
répondu user2941395 2015-08-11 05:55:42

J'ai eu d'énormes problèmes avec mise en page automatique. Nous avons deux conteneurs à l'intérieur de la cellule de table. Le deuxième conteneur est redimensionné en fonction de la description de l'élément (0 - 1000 caractères), et la ligne doit être redimensionnée en fonction d'eux.

L'ingrédient manquant était la contrainte du bas pour la description.

J'ai changé le fond de la contrainte de l'élément dynamique à partir de = 0 pour >= 0.

1
répondu Bojan Tadic 2016-04-21 14:55:06

Voici ce que je trouve fonctionne pour ma situation:

1) La hauteur de L'UILabel a une contrainte > = 0 en utilisant autolayout. La largeur est fixe. 2) assignez le texte dans L'UILabel, qui a déjà une vue d'ensemble à ce stade (Je ne sais pas à quel point c'est vital). 3) Ensuite, faites:

    label.sizeToFit()
    label.layoutIfNeeded()

La hauteur de l'étiquette est maintenant définie de manière appropriée.

1
répondu Chris Prince 2018-04-28 02:29:09

Convient à chaque fois! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];
0
répondu Hannah Louisa Carney 2016-05-17 14:10:02

, Vous pouvez afficher une ligne de sortie puis définissez la propriété Ligne=0 et montrer plusieurs ligne de sortie puis définissez la propriété Ligne=1 et plus

[self.yourLableName sizeToFit];
0
répondu Dixit Akabari 2017-01-06 06:29:42

Il y a aussi cette approche:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];
-1
répondu Dave Cole 2015-06-10 11:37:16