145 votes

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

Je veux afficher une image à côté d'un UILabel, cependant UILabel est variable et la longueur du texte, donc je ne sais pas où placer l'image. Comment puis-je accomplir?

190voto

Aaron Saunders Points 20454
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

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

cette question est peut-être votre réponse, il a travaillé pour moi.


Pour 2014, j'ai édité dans cette nouvelle version, basée sur l'ultra-pratique commentaire par Norbert ci-dessous! Ce n'est tout. Cheers

// 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);

33voto

Chetan Shenoy Points 505

La réponse sélectionnée est correcte pour iOS 6 et ci-dessous.

Dans iOS 7, sizeWithFont:constrainedToSize:lineBreakMode: a été désapprouvée. Il est maintenant recommandé que vous utilisez 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 pas CGSize. Espérons que ce sera de l'aide à des gens à l'utiliser dans iOS 7.

2voto

whyoz Points 1308

Voici quelque chose qui m'est venu après l'application de quelques principes de l'autre AFIN de les postes, y compris Aaron lien:

    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, je vais ajouter un code pin personnalisé pour un MKAnnotation classe qui redimensionne un UILabel en fonction de la taille du texte. Il ajoute également une image sur le côté gauche de la vue, de sorte que vous voyez une partie du code de la gestion de l'espacement approprié pour traiter l'image et le rembourrage.

La clé est d'utiliser CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; , puis de redéfinir la vue de ses dimensions. Vous pouvez appliquer cette logique à tout point de vue.

Bien qu'Aaron réponse qui fonctionne pour certains, cela n'a pas fonctionné pour moi. C'est beaucoup plus détaillée que vous devriez essayer immédiatement avant d'aller ailleurs si vous voulez une image plus dynamique avec une image et redimensionnable UILabel. J'ai déjà fait tout le travail pour vous!!

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