【问题标题】:Change the height of UILabel dynamically based on content根据内容动态改变UILabel的高度
【发布时间】:2014-08-06 09:51:13
【问题描述】:

我有一个UILabel 作为UIButton 的子视图,我正在传递值 从另一个视图并填充到UILabel。现在,我想要那个UILabel 必须根据内容改变它的高度。如果文本是“你好”,它必须 在 1 行中,但如果文本是“我的文本太长,无法放入 label”,它必须改变它的大小。我用过

   [self.addressLabel sizeToFit];

但为此我需要在 UILabel 下方留出空白空间。简直就是我 想要的是当文本强度增加时,UILabel 和 UIView 的大小 必须展开。

【问题讨论】:

标签: objective-c uilabel ios7.1 xcode5.1


【解决方案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,这只是我添加的缓冲区高度,如果不需要你可以忽略,反正我已经更新了代码。
  • 谁能告诉我如何在UITableViewCellUICollectionViewCell 中使用自动布局来实现这一点?
  • @Smarto,阅读此堆栈溢出答案stackoverflow.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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多