Як обчислити ширину UILabel на основі довжини тексту?


142

Я хочу відобразити зображення поруч з 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

156

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


не працює для мене, це не обчислення висоти ширини мітки на основі їх тексту
Чандні

1
Мені ідеально підходить для мене, з власним шрифтом!
fl034

1
ідеальна відповідь на отримання ширини динамічної мітки
Chetan

52

Швидко

 yourLabel.intrinsicContentSize().width 

3
Ця відповідь справедлива лише для викладеного
виду

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 розмірWithFont застарілий, будь ласка, зверніться до

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

Ви можете додати всі потрібні атрибути в sizeWithAttributes. Інші атрибути, які ви можете встановити:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

і так далі. Але, певно, вам не знадобляться інші


10

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

1
Чудово! Зручно для обчислення ширини UIButton відповідно до тексту, де intrinsicContentSize.width не завжди працює правильно.
ноном

8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;

2
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і коли ви матимете достатню репутацію, ви зможете коментувати будь-яку публікацію .
Покірний Щур

ця відповідь розповідає, як регулювати розмір мітки відповідно до тексту. в чому проблема в цьому?
Мед Лахані

2

Ось, що я придумав, застосувавши кілька принципів інших публікацій щодо ПП, включаючи посилання Аарона:

    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. Я вже зробив всю роботу за вас !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.