根据内容动态改变UILabel的高度

3
我有一个 UILabel 作为 UIButton的子视图,并且我正在从另一个视图中传递值并在 UILabel 中填充。现在,我希望 UILabel 根据内容改变其高度。如果文本是“Hello”,它必须在1行中;但如果文本是“我的文本太长而无法适应标签”,它必须更改其大小。我已经使用了


   [self.addressLabel sizeToFit];

但是为了实现这个目的,我需要在UILabel下面留出空白区域。简单来说,我希望当文本内容增加时,UILabel和UIView的大小也会随之扩展。


可能是根据文本调整UILabel高度的重复问题。 - Paul Roub
4个回答

12

您可以使用以下方法获取标签的高度

  • text - 标签中的文本
  • 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);

谢谢,它救了我的一天。 - Durai Amuthan.H
我很感谢你的回答,但是我没有使用表格视图,只是视图控制器。 - Sushil Sharma
1
@iDev,那只是我添加的缓冲高度,如果不需要可以忽略,无论如何,我已经更新了代码。 - karthik
有人能告诉我如何在UITableViewCell或UICollectionViewCell中使用自动布局来实现这个吗? - NullPointer
1
@Smarto,阅读这个Stack Overflow答案https://dev59.com/4WMl5IYBdhLWcg3wCDGW#18746930。 - karthik

3

以下是我处理此问题的方式:

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 是必要的。 - Hashem Aboonajmi

1
请使用此代码,它非常简单并且已更新为 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);

0
这是获取标签动态高度的最简单函数。您可以直接使用此函数。
其中,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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接