UILabel sizeToFit не работает должным образом. Использование setNumberOfLines не работает. Для работы нужна функция переменной высоты

Я пытаюсь показать текст с переменной высотой через UILabel.
Я настроил все с помощью комбинации раскадровки Xcode и кодирования прямо в файлы реализации.

Вот код:

CGRect labelFrame = CGRectMake(20, 20, 280, 800);
descriptionLabel.frame = labelFrame;
NSString *description = self.spell[@"description"];
descriptionLabel.text = description;
[descriptionLabel setNumberOfLines:0];
[descriptionLabel sizeToFit];

Я пробовал изменить функции переноса слов и пробовал поиграть с множеством разных настроек, но безрезультатно.

Есть ли что-то конкретное, что нужно сделать в раскадровке?
Важна ли структура метки моего представления->?
У меня так, чтобы метки были в поле зрения (занимающем весь экран).


person user2050812    schedule 07.02.2013    source источник
comment
Взгляните на эту запись для установки многострочных меток.   -  person Jonathan Cichon    schedule 07.02.2013


Ответы (6)


Я использую SWIFT и столкнулся с той же проблемой. Я исправил это после того, как добавил layoutIfNeeded(). Мой код выглядит следующим образом:

self.MyLabel.sizeToFit()
self.MyLabel.layoutIfNeeded()
person Ken Seow    schedule 24.03.2016

Вам не нужно рассчитывать высоту вручную. Для переменной высоты установите высоту метки равной 0 перед вызовом sizeToFit, как это.

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 0)];
label.numberOfLines = 0;
label.text = @"Some long piece of text...";

[label sizeToFit];
person 1actobacillus    schedule 09.12.2013
comment
Я разрабатываю для iOS 7, и это не работает. Может быть, есть обстоятельства, когда это происходит, но в моем случае, когда все настроено так, как у вас, плюс цвет фона и более крупный шрифт, это не работает. Он просто добавляет многоточие. - person d2burke; 01.04.2014
comment
Установка высоты метки на 0 на раскадровке сделала это для меня очень быстро. Установка кадра в коде не повлияла. - person hablema; 18.09.2014

Вот мое решение любой проблемы, такой как ваша (динамическая высота):

NSString *description = @"Some text";

CGSize dynamicSize = [[description sizeWithFont:[UIFont fontWithName:@"FONT_NAME" size:14] constrainedToSize:CGSizeMake(300, 10000)]; //the width should be the one you need and just put in a very big height so that anything you would put in here would fit
//dynamicSize is now the exact size you will need, with the fixed width and the height just enough so that all the text will fit.

UILabel *someLabel = [[UILabel alloc] initWithFrame:CGRectMake:(0, 0, dynamicSize.width, dynamicSize.height)];
someLabel.font = YOUR_FONT;
someLabel.numberOfRows = 10 //You should calculate how many rows you need by dividing dynamicSize.height to the height of one row (should also take into account the padding that your UILabel will put between rows

На мой взгляд, это самый безопасный способ определения нужной высоты. Кроме того, насколько мне известно, вызов sizeToFit не изменит его размер, если он уже достаточно большой, чтобы вместить весь текст. (Не сделает его меньше ... просто больше, если это необходимо, но не добавит больше строк)

person Andrei Filip    schedule 07.02.2013

Не похоже, что вы устанавливаете lineBreakMode.

Я получил некоторый код из stackoverflow давно, когда и поместил его в категорию, вы можете об этом здесь: http://www.notthepainter.com/multi-line-uilabel/

Но если вам просто нужен код, вот он:

@interface UILabel (BPExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth;
@end
 
@implementation UILabel (EnkiExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth
{
    if (fixedWidth < 0) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, 0);
    } else {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0);
    }
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    [self sizeToFit];
}
@end

Вы называете это так:

helpLabel_.text = @"You need to cut the blue wire and ground the red wire. Do not cut the red wire and ground the blue wire, that would be bad.";
[helpLabel_ sizeToFitFixedWidth: desiredWidth ];
person Paul Cezanne    schedule 07.02.2013

Я пытался создать то же самое, и у меня это полностью работает. (В моем приложении нет раскадровки, но я не думаю, что это на что-нибудь повлияет.)

UILabel *bioLabel = [[UILabel alloc] init];
CGRect labelFrame = CGRectMake(0, 100, 320, 500);
bioLabel.frame = labelFrame;
NSString *bio =@"YOUR_TEXT_HERE";
bioLabel.text = description;
[bioLabel setNumberOfLines:0];
[bioLabel sizeToFit];
[self.view addSubview:bioLabel];
person Jim    schedule 07.02.2013

У меня тоже проблема, мой код такой:

    TeacherTagBtn *tagBtn = [[TeacherTagBtn alloc] init];
    [tagBtn setTitle:tagModel.values forState:UIControlStateNormal];

    [tagBtn.titleLabel sizeToFit];

Вы знаете подкласс TeacherTagBtn UIbutton! тогда я хочу получить ширину метки следующим образом:

tempBtn.titleLabel.frame.size.width

В конце концов, я потерпел неудачу. ширина равна 0. так вот:

    TeacherTagBtn *tagBtn = [[TeacherTagBtn alloc] initWithFrame:CGRectMake(0, 0, 100, 16)];
    [tagBtn setTitle:tagModel.values forState:UIControlStateNormal];
    [tagBtn.titleLabel sizeToFit];

только добавить рамку, работает отлично!

person Mango    schedule 27.10.2015