根据内容动态改变UILabel的高度
Posted
技术标签:
【中文标题】根据内容动态改变UILabel的高度【英文标题】:Change the height of UILabel dynamically based on content 【发布时间】:2014-08-06 09:51:13 【问题描述】:我有一个UILabel
作为UIButton
的子视图,我正在传递值
从另一个视图并填充到UILabel
。现在,我想要那个UILabel
必须根据内容改变它的高度。如果文本是“你好”,它必须
在 1 行中,但如果文本是“我的文本太长,无法放入
label”,它必须改变它的大小。我用过
[self.addressLabel sizeToFit];
但为此我需要在 UILabel 下方留出空白空间。简直就是我 想要的是当文本强度增加时,UILabel 和 UIView 的大小 必须展开。
【问题讨论】:
Adjust UILabel height depending on the text的可能重复 【参考方案1】:使用下面可以得到标签的高度
text - 标签的文本 字体 - 标签中使用的字体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);
【讨论】:
感谢它拯救了我的一天 感谢您的回答,但我没有使用表格视图。它只是视图控制器。 @iDev,这只是我添加的缓冲区高度,如果不需要你可以忽略,反正我已经更新了代码。 谁能告诉我如何在UITableViewCell
或UICollectionViewCell
中使用自动布局来实现这一点?
@Smarto,阅读此堆栈溢出答案***.com/a/18746930/1730345。【参考方案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];
【讨论】:
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 是用于返回最小整数值的预定义函数。 而 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;
【讨论】:
以上是关于根据内容动态改变UILabel的高度的主要内容,如果未能解决你的问题,请参考以下文章
iOS:根据 View 位置动态改变 UILabel Alignment
在tableview ios中使用UILabel的单元格的动态高度