UILabel sizeThatFits不起作用

我试图计算一个UITableViewCell的高度,所以我定义了一个类似这样的方法

+ (CGFloat)heightWithText:(NSString *)text { SizingLabel.text = text; [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)]; return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_MARGIN); } 

我已经这样定义了SizingLabel:

 + (void)initialize { SizingLabel = [[UILabel alloc] initWithFrame:CGRectZero]; SizingLabel.numberOfLines = 0; SizingLabel.lineBreakMode = NSLineBreakByWordWrapping; } 

但是,如果我在-heightWithText:方法中插入断点,我注意到SizingLabel的尺寸永远不会改变,因此我得到一个不正确的值。 这是为什么?

 + (CGFloat)heightWithText:(NSString *)text { SizingLabel.text = text; CGSize labelSize = [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)]; return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN); } 

在您的自定义单元格类中执行此操作

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // Initialization code //Message Label lbl_name = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 25)]; [lbl_name setFont:[UIFont fontWithName:@"Helvetica" size:16.0f]]; lbl_name.lineBreakMode = UILineBreakModeWordWrap; lbl_name.numberOfLines = 0; [lbl_name sizeToFit]; [self.contentView addSubview:lbl_name]; //Time } return self; } -(void)resizeNameLabel:(NSString *)text { CGSize constraint = CGSizeMake(300 , 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:16.0f] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; [lbl_name setFrame:CGRectMake(10, 5, 300, MAX(size.height, 25.0f))];//300 Label Width [lbl_name setText:text]; } 

在主课上做这个

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (cell == nil) { cell = (CustomCell *)[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; } [((CustomCell *)cell) resizeNameLabel:text]; return cell; } 

就这样做…

如上所述, sizeThatFits: ((因此sizeToFit )不适用于UILabel对象。

您最好使用首选的textRectForBounds:limitedToNumberOfLines:方法:

 + (CGFloat)heightWithText:(NSString *)text { resizingLabel.text = text; CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX) limitedToNumberOfLines:0].size; // No limit return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN); } 

下面的代码是计算dynamic文本长度的矩形(ios7版本)

 - (CGRect)labelFrameWithText:(NSString *)text { CGRect rect; // the font of your text UIFont *font = [UIFont systemFontOfSize:15.0]; NSDictionary *attributes = @{NSFontAttributeName: font}; // the first parametric CGSize is the max size that the rect's size can be CGRect boundingRect = [text boundingRectWithSize:CGSizeMake(youImageWidth, 100.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil]; //the rect of the UILabel //This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function. rect = CGRectMake(yourLabelOriginX, yourLabelOriginY, ceil(boundingRect.size.width), ceil(boundingRect.size.height)); return rect; } 

在得到矩形后,用它来计算你的单元大小

—————-旧版本——————-

 CGSize contentSize = [content sizeWithFont:font constrainedToSize:CGSizeMake(maxWidth, maxHeight) lineBreakMode: NSLineBreakByWordWrapping]; 

为了简单的确定文本的UILabel大小,我将这个类别添加到了UILabel中。

 @implementation UILabel (PAUtils) - (CGSize)jb_attributedSizeThatFits:(CGSize)size { CGRect textRect = [self.attributedText boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil]; return textRect.size; } @end 

有两件事要注意:

  1. 当不设置attributedText text (而是只使用text )时,此方法不考虑numberOfLines属性。
  2. boundingRectWithSize返回点的分数。 如果使用此方法返回的值作为布局,则应该ceilf宽高宽。