UItableviewcell中的多行UIlabel使用Autolayout

Posted

技术标签:

【中文标题】UItableviewcell中的多行UIlabel使用Autolayout【英文标题】:Multiple line UIlabel in UItableviewcell using Autolayout 【发布时间】:2015-01-24 07:17:30 【问题描述】:

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

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

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

一般UIlabel 的高度取决于preferredMaxLayoutWidth。 谁能告诉我如何删除这个额外的填充并呈现UIlabel 的确切高度?

【问题讨论】:

为了让事情更清楚,我在我的代码中使用了自动布局。 【参考方案1】:

试试这个代码,

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;

【讨论】:

我在我的代码中使用了自动布局。但是在你的代码截图中你要求我设置框架。有没有办法使用自动布局来解决它?【参考方案2】:

最简单的方法是扩展你自己的 UITableViewCell 类,并在那里创建一个 UILabel,同时创建一个公共 getMethod:

界面:

- (CGFloat)getLabelHeight;

实施:

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

表格视图文件:

-(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 数据

我没有时间测试它,但我希望它有效。

【讨论】:

我在我的代码中使用了自动布局,由于某些原因我无法在我的代码中禁用自动布局。有没有办法在启用自动布局的情况下解决它?【参考方案3】:

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

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

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

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

【讨论】:

以上是关于UItableviewcell中的多行UIlabel使用Autolayout的主要内容,如果未能解决你的问题,请参考以下文章

UItableviewcell中的多行UIlabel使用Autolayout

在 UITableViewCell 中的 detailTextLabel 中添加多行

iOS 9 上的静态 UITableViewCell 中的多行 UILabel

UITableViewCell 中的几个多行标签,情节提要 xcode 6.3.2 中的自动布局

UITableViewCell 中的多行 UILabel 在 iOS8 中使用 autoLayout 给出错误的高度

具有多行输入字段的 UITableViewCell?