Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

В быстрой

 yourLabel.intrinsicContentSize().width 

Ответ 4

Выбранный ответ правильный для 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 не a CGSize. Надеюсь, это поможет некоторым людям, использующим его в iOS 7.

Ответ 5

В iOS8 sizeWithFont устарел, обратитесь к

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

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

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

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

Ответ 6

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

Ответ 7

Вот что я придумал после применения нескольких принципов других сообщений SO, включая ссылку 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];

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

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

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