使用自动布局的 UItableviewcell 中的多行 UIlabel

Multiple line UIlabel in UItableviewcell using Autolayout

我已将 setMaXPreferredLayoutWidth 设置为 UILabel 并将所有必需的约束添加到 UIlabel 现在我可以在我的 UItableviewcell 中看到多行 UIlabel 但是我的问题是我根据 MaxpreferredLayoutWidth 值在 UIlabel 的顶部和底部获得了额外的填充。

当我将 MaxPreferreLayoutWidth 设置为 200 时,我得到了这个

当我将 MaxPreferreLayoutWidth 设置为 100 时,我得到了这个

一般UIlabel身高取决于preferredMaxLayoutWidth。 任何人都可以告诉我如何删除这个额外的填充并呈现 UIlabel 的确切高度吗?

试试这个代码,

CGSize suggestedSize = [textWithMultipleLines sizeWithFont:myLabel.font constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];//here "width" is the maximum acceptable width of myLabel
CGRect labelFrame = myLabel.frame;
labelFrame.size = suggestedSize;
[myLabel setFrame:labelFrame];

并在

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
{
     //get the string assigned to label
     CGSize suggestedSize = [stringAssignedToLabel sizeWithFont:myLabel.font constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
     return suggestedSize.height+5;
}

最简单的方法是扩展您自己的 UITableViewCell class,并在那里创建一个 UILabel,同时创建一个 public getMethod:

Interface:

- (CGFloat)getLabelHeight;

Implementation:

- (CGFloat)getLabelHeight {
  return label.frame.size.height
}

TableView File:

-(CGFloat)heightForRowAtIndexPath {
    return [cell getLabelHeight]
}

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath)indexPath {

   your_cell_instance = [[Your_Cell_Class alloc]initWithTableViewCellStyle:UITableViewCellStyleDefault andReuseID:your_reuse_id];

   your_cell_instance.text = @"Your Long Text"
   [your_cell_instance setNumberOfLines:0];
   [your_cell_instance sizeToFit];

   return your_cell_instance;

}

重要的是首先设置标签的文本,然后 // 行数和 sizeToFit //

并且您需要在适当的时候重新加载 tableView 数据

我还没来得及测试,但我希望它有用。

我们在heightForRowAtIndexPath
中计算单元格的高度时必须设置tableviewcell的框架 例如:

[tableViewCell setFrame:CGRectMake(0, 0, CGRectGetWidth(self.tableView.bounds), CGRectGetHeight(tableViewCell.bounds))];

然后在 UItableviewcelllayoutSubviews 方法中我们必须设置 preferredMaxLayoutwidth
例如:

[self.multilineLabel setPreferredMaxLayoutWidth:CGRectGetWidth(self.bounds)];