150 votes

<span>UILabel - étiquette redimensionnable pour s'adapter au texte?</span>

Est-il possible de redimensionner automatiquement la boîte / limites de UILabel pour s'adapter au texte qu'elle contient ? (Je me fiche qu'elle finisse par être plus grande que l'affichage)

Donc si un utilisateur entre "bonjour" ou "mon nom est vraiment long et je veux qu'il s'adapte à cette boîte", il n'est jamais tronqué et l'étiquette est 'élargie' en conséquence ?

0 votes

Quelqu'un peut-il s'il vous plaît m'aider en fournissant des codes swift?

99voto

Daniel Points 14150

Veuillez consulter mon gist 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 cet article : https://stackoverflow.com/a/7242981/662605

Cela étirerait la hauteur, mais vous pouvez facilement le modifier pour fonctionner dans l'autre sens et étirer la largeur avec quelque chose comme ceci, ce qui, je crois, est 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 pourriez utiliser plus simplement la méthode sizeToFit disponible dans la classe UIView, mais définissez le nombre de lignes sur 1 pour être prudent.


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 redimensionnera automatiquement votre étiquette (ajoutant plus de hauteur) pour s'adapter à votre texte.


Mise à jour iOS 8

sizeWithFont: est obsolète, utilisez plutôt sizeWithAttributes: :

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

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

    return expectedLabelSize.width;
}

8 votes

En utilisant la méthode AutoLayout iOS 6, je me suis retrouvé avec une contrainte de hauteur sur mon étiquette que je n'arrivais pas à me débarrasser. En définissant la Relation de la contrainte de hauteur sur 'Supérieur ou égal', la hauteur a pu augmenter.

2 votes

SizeWithFont: constrainedToSize: lineBreakMode: méthode obsolète dans iOS 7

1 votes

UILabel ne se redimensionne pas quand le texte est moins / plus. J'utilise Auto-layout. J'ai essayé de créer UILabel mais ils sont créés à chaque fois que cellForRowAtIndex est initialisé. J'ai essayé beaucoup de choses. Rien ne fonctionne pour moi. L'arrière-plan de uilabel prend la même largeur. AIDE !!!

76voto

En utilisant [label sizeToFit]; vous obtiendrez le même résultat de la catégorie de Daniels.

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

3 votes

Lors de l'utilisation de Swift, j'ai dû exécuter cela sur le thread principal en utilisant `dispatch_async(dispatch_get_main_queue(),{});`.

0 votes

@Zeezer sais-tu pourquoi?

13 votes

@FurloSK Toutes les modifications de l'interface utilisateur doivent être effectuées dans le thread principal.

9voto

Gaurav Gilani Points 469

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

5voto

Doug Baker Points 53

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];
}

3voto

Kaijay Lu Points 91
@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

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

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