4

我来自这个很好的答案:
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

我已经实现了该答案中描述的内容,但我面临着一些不同的情况。我没有,UILabel但是我有一个动态的UILabels 列表。

我创建了一张图片,展示了表格视图应该是什么样子的一些不同情况:

在此处输入图像描述

在回购的当前状态下,单元格不会垂直增长以适应单元格的contentView.


更新

回购:https ://github.com/socksz/DynamicHeightCellAutoLayout

如果您尝试从 repo 获取项目并运行它,您可以确切地看到我所指的问题是什么。我无法得到让它工作所缺少的东西。

4

2 回答 2

3

这里的问题在于您正在使用的第三方组件 FXLabel,而不是围绕表格视图或其中的自动布局的任何代码。为了支持 Auto Layout,UIView 的自定义子类必须-[intrinsicContentSize]适当地实现该方法,然后-[invalidateIntrinsicContentSize]在发生变化时调用它。

在这种情况下,FXLabel 似乎依赖于其超类实现 (UILabel) 来实现上述方法,并且由于 UILabel 并非旨在以 FXLabel 实现它的方式处理可变行距,因此它不知道要返回的正确 intrinsicContentSize ,因此自动布局计算是错误的(在这种情况下,因为内在内容大小太小)。查看这篇出色的 obj.io 文章的“为自动布局启用自定义视图”部分以了解更多详细信息。

现在好消息是,从 iOS 6 开始,您应该能够使用标准 UILabel 中的属性字符串来完成此操作。在这里查看Stack Overflow 的答案

如果出于某种原因你真的很喜欢 FXLabel,也许你可以在 GitHub 项目上打开一个问题(或者尝试自己修复它并提交一个拉取请求)。

于 2013-12-15T19:46:08.320 回答
1

要设置行高和估计行高的自动尺寸,请确保执行以下步骤,自动尺寸对单元格/行高布局有效。

  • 分配和实现dataSource和delegate
  • 分配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(& 换行模式 = 截断尾部)
  • 设置关于其超级视图/单元格容器的所有约束(顶部、底部、左右)。
  • 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。

在此处输入图像描述

于 2017-10-11T11:02:19.447 回答