Как рассчитать ширину UILabel на основе длины текста?

143

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

Шихан Алам
источник

Ответы:

191
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);
Аарон Сондерс
источник
41
Просто примечание: это устарело с iOS7. Предпочтительный способ сейчас:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Норберт
17
Вы также можете использовать свойство IntrinsicContentSize. Мне не очень нравится Objective-c, но это должно быть примерно так: self.yourLabel.intrinsicContentSize Это даст вам размер содержимого метки, так что вы можете просто получить ширину оттуда.
Борис
1
Просто yourLabel.intrinsicContentSize.widthотлично работает, проверьте ответ ниже.
denis_lor 06
158

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

Якуб Трухларж
источник
не работает для меня, это не вычисление ширины метки и высоты на основе их текста
Чандни
1
У меня отлично работает, также с настраиваемым шрифтом!
fl034
1
идеальный ответ для получения ширины динамической метки
Четан
52

Быстро

 yourLabel.intrinsicContentSize().width 
Аршад
источник
5
Этот ответ действителен только для изложенного представления
rommex
33

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

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

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

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

Четан Шеной
источник
12

В iOS8 функция sizeWithFont устарела, см.

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

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

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

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

Jarora
источник
11

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

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

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
iOS Lifee
источник
1
Большой! Удобно для вычисления ширины UIButton по тексту, где intrinsicContentSize.width не всегда работает правильно.
nomnom
8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Мед Лахани
источник
2
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением - вы всегда можете комментировать свои собственные сообщения, и как только у вас будет достаточная репутация, вы сможете комментировать любое сообщение .
The Humble Rat
этот ответ расскажет, как настроить размер метки в соответствии с текстом. в чем проблема?
Хани Лакани,
2

Вот что я придумал после применения нескольких принципов в других сообщениях 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. Я уже сделал за тебя всю работу !!

почемуоз
источник