UILabel sizeToFit, не работающий правильно. Используя setNumberOfLines doesn' t работа. Нужна переменная функция высоты, чтобы работать

Я пытаюсь показать переменное количество высоты текста через 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];

Я попытался менять функции перехода на новую строку и попытался играть с большим количеством различных параметров настройки, но напрасно.

Is there something specific that needs to be done in the storyboard?
Is the structure of my view->label important?
I have it so that the labels are in a view (which takes up the whole screen).

6
Смотрите на это почта для урегулирования многострочных этикеток
добавлено автор Jonathan Cichon, источник

6 ответы

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

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

[label sizeToFit];
9
добавлено
Урегулирование высоты этикетки к 0 на раскадровке сделало это для меня в быстро. Урегулирование структуры в коде не имело эффект.
добавлено автор hablema, источник
I' m развивающийся для iOS 7 и этого doesn' t работа. Возможно, есть обстоятельства, где это делает, но в моем случае, со всем установил способ, которым у вас есть он, плюс цвет фона и больший шрифт, это doesn' t работа. Это просто добавляет эллипсис.
добавлено автор d2burke, источник

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

self.MyLabel.sizeToFit()
self.MyLabel.layoutIfNeeded()
6
добавлено

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

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 не изменится, это - размер, если это уже достаточно большое, чтобы держать весь текст. (не сделает его меньшим... просто больше, если это должно будет, но это не добавит больше линий),

1
добавлено

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

UILabel *bioLabel = [[UILabel alloc] init];
CGRect labelFrame = CGRectMake(0, 100, 320, 500);
bioLabel.frame = labelFrame;
NSString *bio [email protected]"YOUR_TEXT_HERE";
bioLabel.text = description;
[bioLabel setNumberOfLines:0];
[bioLabel sizeToFit];
[self.view addSubview:bioLabel];
0
добавлено

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

I got some code from stackoverflow way back when and put it into a category, you can about it here: 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 ];
0
добавлено

Я испытываю затруднения также, мой код как это:

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

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

0
добавлено