Изменение высоты UILabel динамически на основе контента
У меня есть UILabel
как subview UIButton
, и я передаю значение
с другого представления и заселения в UILabel
. Теперь я хочу, чтобы UILabel
должен изменить свою высоту на основе содержимого. Если текст "Hello", он должен
быть в 1 строке, но если текст "мой текст слишком длинный, чтобы вписаться в
label ", он должен изменить свой размер. Я использовал
[self.addressLabel sizeToFit];
Но для этого мне нужно оставить пустое пространство ниже UILabel. Просто, что я
хочу, чтобы при увеличении силы текста размер UILabel и UIView
должен расширяться.
Ответы
Ответ 1
Используя ниже, вы можете получить высоту метки
- текст - текст метки
- font - font, используемый в метке
-
width - ширина метки
-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;
SEL selector = @selector(boundingRectWithSize:options:attributes:context:);
if ([text respondsToSelector:selector]) {
title_size = [text boundingRectWithSize:constraint
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{ NSFontAttributeName : font }
context:nil].size;
totalHeight = ceil(title_size.height);
} else {
title_size = [text sizeWithFont:font
constrainedToSize:constraint
lineBreakMode:NSLineBreakByWordWrapping];
totalHeight = title_size.height ;
}
CGFloat height = MAX(totalHeight, 40.0f);
return height;
}
и создайте кадр с использованием высоты
CGRect frame = questionTitleLbl.frame;
float height = [self getHeightForText:questionTitleLbl.text
withFont:questionTitleLbl.font
andWidth:questionTitleLbl.frame.size.width];
float gap = 2;
cell.questionTitleLbl.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
height);
Ответ 2
Вот как я справляюсь с этой проблемой:
UILabel *sight = (UILabel *)[cell viewWithTag:100];
sight.text=tmpGroup.title;
sight.frame =CGRectMake(sight.frame.origin.x, sight.frame.origin.y, 191, 21);
sight.font = [UIFont fontWithName:@"RobotoSlab-Bold" size:10];
sight.numberOfLines=0;
sight.lineBreakMode=NSLineBreakByWordWrapping;
[sight sizeToFit];
Ответ 3
Используйте этот код очень легко и обновлен с помощью ios8
добавьте этот метод в свой файл appconstant
inline static CGSize getLabelHeightForFont(NSString *fontName,NSString* str, float fontSize, float lblWidth)
{
NSString *text = str;
CGFloat width = lblWidth;
UIFont *font = [UIFont fontWithName:fontName size:fontSize];
NSAttributedString *attributedText =
[[NSAttributedString alloc]
initWithString:text
attributes:@
{
NSFontAttributeName: font
}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
return rect.size;
}
и, наконец, использовать этот код для динамического создания UILabel
CGFloat lbl_height = getLabelHeightForFont(@"System- System", address, 15, lbl_address.frame.size.width);
lbl_address.numberOfLines = 0;
lbl_address.textAlignment = NSTextAlignmentLeft;
[lbl_address setLineBreakMode:NSLineBreakByWordWrapping];
lbl_address.frame = CGRectMake(lbl_address.frame.origin.x, lbl_address.frame.origin.y, lbl_address.frame.size.width, lbl_height+5);
Ответ 4
Это самая простая функция для получения динамической высоты для меток. Вы можете просто использовать эту функцию.
Здесь ceil - это функция predefind для возврата наименьшего целочисленного значения.
И MAXHEIGHT - максимальная высота для uilabel, например, вы можете дать 1000 также для будущих калокаций...
-(CGFloat) getHeightForLabels : (UILabel *) label
{
CGSize widthMaxHeight = CGSizeMake(label.frame.size.width, MAXHEIGHT);
CGSize size;
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize boundingRect = [label.text boundingRectWithSize:widthMaxHeight
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:label.font}
context:context].size;
size = CGSizeMake(ceil(boundingRect.width), ceil(boundingRect.height));
return size.height;
}