web-dev-qa-db-fra.com

Comment calculer la largeur UILabel en fonction de la longueur du texte?

Je souhaite afficher une image à côté d'un UILabel, mais UILabel a une longueur de texte variable. Je ne sais donc pas où placer l'image. Comment puis-je accomplir cela?

132
Sheehan Alam
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

Qu'est-ce que - [NSString sizeWithFont: forWidth: lineBreakMode:] convient-il?

cette question pourrait avoir votre réponse, cela a fonctionné pour moi.


Pour 2014, j'ai édité dans cette nouvelle version, basée sur le commentaire ultra-pratique de Norbert ci-dessous! Cela fait tout. À votre santé

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);
187
Aaron Saunders

yourLabel.intrinsicContentSize.width pour Objective-C/Swift

140
Jakub Truhlář

En rapide

 yourLabel.intrinsicContentSize().width 
49
Arshad

La réponse sélectionnée est correcte pour iOS 6 et inférieur.

Dans iOS 7, sizeWithFont:constrainedToSize:lineBreakMode: a été obsolète. Il est maintenant recommandé d'utiliser boundingRectWithSize:options:attributes:context:.

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

Notez que la valeur de retour est un CGRect et non un CGSize. Espérons que cela aidera les utilisateurs de iOS 7.

33
Chetan Shenoy

Dans iOS8, sizeWithFont est obsolète, veuillez vous référer à

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

Vous pouvez ajouter tous les attributs souhaités dans sizeWithAttributes. Autres attributs que vous pouvez définir:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

etc. Mais vous n'aurez probablement pas besoin des autres

12
jarora
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
7
Honey Lakhani

Swift 4 Answer qui utilise Constraint

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
5
iOS Lifee

Voici quelque chose que je suis venu après avoir appliqué quelques principes autres SO posts, y compris le lien de Aaron:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

Dans cet exemple, j'ajoute une broche personnalisée à une classe MKAnnotation qui redimensionne un UILabel en fonction de la taille du texte. Il ajoute également une image sur le côté gauche de la vue, ce qui vous permet de voir une partie du code gérer l'espacement approprié pour gérer l'image et le remplissage.

La clé est d'utiliser CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; puis redéfinissez les dimensions de la vue. Vous pouvez appliquer cette logique à n’importe quelle vue.

Bien que la réponse d'Aaron fonctionne pour certains, cela ne fonctionna pas pour moi. Ceci est une explication beaucoup plus détaillée que vous devriez essayer immédiatement avant d'aller ailleurs si vous voulez une vue plus dynamique avec une image et UILabel redimensionnable. J'ai déjà fait tout le travail pour vous !!

2
whyoz