根据表格视图单元格中的内容更改 uilabel 高度

Posted

技术标签:

【中文标题】根据表格视图单元格中的内容更改 uilabel 高度【英文标题】:Change uilabel height based on content in a tableview cell 【发布时间】:2018-01-15 13:48:10 【问题描述】:

我想根据里面的文字扩展标签的高度。我将 tableviewcontroller 与静态单元格一起使用。

我在表格视图单元格中有一个UILabel,我设置了标签的顶部、底部、右侧和左侧约束。

我尝试了这些解决方案:

self.eDesc.numberOfLines = 0
self.eDesc.lineBreakMode = NSLineBreakMode.byWordWrapping
self.eDesc.sizeToFit()

self.tableView.estimatedRowHeight = 140
self.tableView.rowHeight = UITableViewAutomaticDimension

但它们都不起作用。

还有其他方法吗(可能通过标签框改变大小)?

【问题讨论】:

这是唯一的解决方案,并且 100% 有效,所以让我知道您的输出是什么,以便我可以根据它为您提供帮助。 你实现了 heightForRowAt 函数并在那里重新调整了 UITableViewAutomaticDimension 吗? @Kingalione 我试过了,但现在 uilabel 完全消失了。顺便说一下,我是一个带有静态单元格的 tableviewcontroller 我正在用截图编辑问题 @Krunal 再次检查所有这些... 【参考方案1】:

要设置行高和估计行高的自动尺寸,请确保执行以下步骤,自动尺寸对单元格/行高布局有效。我刚刚测试了以下步骤和代码并且工作正常。

分配和实现 tableview 数据源和委托 将UITableViewAutomaticDimension 分配给rowHeight 和estimatedRowHeight 实现委托/数据源方法(即heightForRowAt 并向其返回值UITableViewAutomaticDimension

-

@IBOutlet weak var table: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    // Swift 4.2 onwards
    table.rowHeight = UITableView.automaticDimension
    table.estimatedRowHeight = UITableView.automaticDimension


    // Swift 4.1 and below
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension





// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    // Swift 4.2 onwards
    return UITableView.automaticDimension

    // Swift 4.1 and below
    return UITableViewAutomaticDimension

对于 UITableviewCell 中的标签实例

设置行数=0(&换行模式=截尾) 设置与其父视图/单元格容器相关的所有约束(顶部、底部、左右)。 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。

编辑:您必须缺少单元格中任何 UIElement 的顶部或底部或高度布局约束。确保单元格中的所有 UIElement 具有有效的顶部和底部(以及高度,只要需要)约束,并附有垂直(相邻)UIElement。

注意:如果您有多个标签(UIElements)具有动态长度,应根据其内容大小进行调整:为您的标签调整'Content Hugging and Compression Resistance Priority'想要以更高的优先级展开/压缩。

在此示例中,我设置了低拥抱和高抗压优先级,这导致为第二个(黄色)标签的内容设置更高的优先级/重要性。

【讨论】:

我编辑了我的问题。您可以看到此更改的结果 当单元格中有其他内容时,此答案根本不起作用(标签在 AutoLayout 中的优先级最低)..您没有调整 UILabel 的 contentHuggingPriority 和 contentCompressionResistancePriority.. Hugging 应该是.defaultLow 和 resistance 应该是 .defaultHigh 以允许标签根据自己的内容调整大小,这将强制单元格调整大小。如果没有这个,如果任何视图中有其他内容有标签,标签将采取最后的优先级并截断或根本不显示.. @Brandon - 你是绝对正确的,但在这种情况下,它会在设计时显示错误,并建议设置拥抱优先级。另一点是:OP 最初要求并要求提供单个标签,因此我添加了一个带有单个标签的示例演示。顺便感谢您的评论,您的观点应该注意并且非常重要。如果有多个标签,则需要拥抱优先级。我会更新我的答案。 我只有 1 个标签需要调整。但是我设置了低拥抱和高抗压优先级。我添加了缺失的约束。现在使用 heightForRowAt 和 UITableViewAutomaticDimension,看起来还可以,但是 UILabel 仍然没有得到调整。 @UtkuDalmaz 你能分享一个带有 git 测试信息的示例代码/项目吗?所以我可以检查一下,这到底是什么问题

以上是关于根据表格视图单元格中的内容更改 uilabel 高度的主要内容,如果未能解决你的问题,请参考以下文章

为啥表格视图单元格中的自动布局会导致表格的内容大小被错误地更改?

自定义大小的表格视图单元格中的 UILabel 中的行数

如何使用自定义表格视图单元格中识别的点击手势从 UILabel 呈现视图控制器?

从表格视图单元格中删除 UIlabel 文本

在自定义单元格中调整 iOS 7.1 中的 UILabel 大小

表格视图单元格中的自增长标签