Изменение размера UILabel на основе содержимого
У меня есть UILabel, его размер текста имеет свойство
title.adjustsFontSizeToFitWidth = YES;
что мешает мне использовать стандартные методы для изменения размера UILabel. Я читал на другом месте здесь, что я должен использовать функцию
sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode
из этого ответа: Как определить размер шрифта UILabel, когда -adjustsFontSizeToFitWidth установлен на YES?
Теперь я не могу понять, как заставить его работать. Это фактический код
UIFont *font = [UIFont fontWithName:@"Marker Felt" size:200];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
title.text = @"this is a long title that should be resized";
title.font = font;
title.numberOfLines = 1;
title.adjustsFontSizeToFitWidth = YES;
CGFloat pointSize = 0.0;
CGSize size = [title.text sizeWithFont:font
minFontSize:title.minimumFontSize
actualFontSize:&pointSize
forWidth:width
lineBreakMode:title.lineBreakMode];
title.frame = CGRectMake(title.frame.origin.x,
title.frame.origin.y,
size.width,
size.height);
UILabel получает неправильное изменение размера, как если бы размер шрифта он еще 200..
Любые подсказки? Спасибо!
Ответы
Ответ 1
Я предлагаю записать это как ошибку.
Размер, возвращаемый -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
, имеет правильную ширину, но не высота не учитывает фактический размер шрифта.
Похоже, что UILabel
также имеет эту ошибку. Изменение размера метки в соответствии с высотой текста в шрифте размера, возвращаемого -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
, будет неправильно вертикально размещать текст внутри метки.
Обход - это вычисление правильной высоты и изменение шрифта на ярлыке с фактическим размером шрифта:
CGFloat pointSize = 0.0f;
CGRect frame = title.frame;
frame.size = [title.text sizeWithFont:font
minFontSize:title.minimumFontSize
actualFontSize:&pointSize
forWidth:width
lineBreakMode:title.lineBreakMode];
UIFont *actualFont = [UIFont fontWithName:@"Marker Felt" size:pointSize];
CGSize sizeWithCorrectHeight = [title.text sizeWithFont:actualFont];
frame.size.height = sizeWithCorrectHeight.height;
title.frame = frame;
title.font = actualFont;
Ответ 2
У меня есть код, который вы могли бы использовать на моем github, проверьте его, это категория для UILabel, вам нужно установить ширину кадра, и когда вы можете изменить размерToFit на UILabel, он регулирует высоту, чтобы соответствовать содержимому, и возвращает y-позицию конца ярлыка, чтобы вы могли отрегулировать любое содержимое, появившееся после него.
https://gist.github.com/1005520
Ответ 3
Попробуйте создать шрифт с меньшим fontSize. Например:
UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
но до actualFontSize передать ссылку на CGFloat == 200.
ОБНОВЛЕНО:
попробуйте следующее:
UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
title.text = @"this is a long title that should be resized";
title.font = font;
title.numberOfLines = 1;
title.adjustsFontSizeToFitWidth = YES;
CGFloat pointSize = 0.0;
CGSize size = [title.text sizeWithFont:font minFontSize:title.minimumFontSize actualFontSize:&pointSize forWidth:width lineBreakMode:title.lineBreakMode];
title.frame = CGRectMake(title.frame.origin.x, title.frame.origin.y, size.width, size.height);
font = [UIFont fontWithName:@"Marker Felt" size:200];
title.font = font;
Ответ 4
UILabel * label = [[UILabel alloc] init];
[label setNumberOfLines:0];
label.text=[detailDict valueForKey:@"method"];
[label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
CGSize labelsize=[label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(250, 1000.0) lineBreakMode:UILineBreakModeWordWrap];
int y=0;
label.frame=CGRectMake(38, y, 245, labelsize.height);
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor whiteColor]];
scrollView.showsVerticalScrollIndicator = NO;
y+=labelsize.height;
[scrollView setContentSize:CGSizeMake(200,y+50)];
[scrollView addSubview:label];
[label release];
Я думаю, вы должны использовать этот код, и я использую метку на scrollview для большого текста, который вы также можете сделать.
Ответ 5
Вы пробовали intrinsicContentSize?
myLable.numberOfLines = 0
myLable.frame = CGRect(x: 10, y: 10, width: 300, height: lblSuperscript.intrinsicContentSize().height)