Как рассчитать ширину UILabel на основе длины текста? - PullRequest
130 голосов
/ 20 августа 2010

Я хочу отобразить изображение рядом с UILabel, однако UILabel имеет переменную длину текста, поэтому я не знаю, где разместить изображение. Как мне это сделать?

Ответы [ 8 ]

186 голосов
/ 20 августа 2010
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

Что такое - [NSString sizeWithFont: forWidth: lineBreakMode:] подходит для?

на этот вопрос может быть ваш ответ, у меня это сработало.


В 2014 году я редактировал эту новую версию, основываясь на очень удобном комментарии Норберта ниже! Это все делает. Приветствия

// 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);
137 голосов
/ 26 октября 2014

yourLabel.intrinsicContentSize.width для Objective-C / Swift

48 голосов
/ 20 января 2015

В быстром

 yourLabel.intrinsicContentSize().width 
32 голосов
/ 24 сентября 2013

Выбранный ответ правильный для iOS 6 и ниже.

В iOS 7 sizeWithFont:constrainedToSize:lineBreakMode: устарела устарела . Теперь рекомендуется использовать boundingRectWithSize:options:attributes:context:.

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

Обратите внимание, что возвращаемым значением является CGRect, а не CGSize. Надеюсь, это поможет людям, использующим его в iOS 7.

11 голосов
/ 12 января 2015

В iOS8 sizeWithFont устарела, см.

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

Вы можете добавить все нужные атрибуты в sizeWithAttributes.Другие атрибуты, которые вы можете установить:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

и так далее.Но, вероятно, другие вам не понадобятся

6 голосов
/ 07 августа 2015
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
3 голосов
/ 30 мая 2018

Swift 4 Ответ, кто использует ограничение

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
1 голос
/ 21 августа 2012

Вот кое-что, что я придумал после применения нескольких принципов других постов SO, включая ссылку Аарона:

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

В этом примере я добавляю пользовательский пин-код в класс MKAnnotation, который изменяет размер UILabelв соответствии с размером текста.Он также добавляет изображение в левой части представления, поэтому вы видите часть кода, управляющего правильным интервалом для обработки изображения и заполнения.

Ключ должен использовать CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];, а затем переопределить представлениеразмеры.Вы можете применить эту логику к любому представлению.

Хотя ответ Аарона работает для некоторых, он не работает для меня.Это гораздо более подробное объяснение, которое вы должны попробовать немедленно, прежде чем отправиться куда-либо еще, если вы хотите более динамичный вид с изображением и изменяемым размером UILabel.Я уже сделал всю работу за тебя !!

...