iOS自动布局:表格视图单元格的动态高度

时间:2013-05-21 16:08:34

标签: ios uitableview autolayout nslayoutconstraint row-height

我有一组带有一组单元格的表视图(自定义单元格,只有内容视图)。

tableView:cellForRowAtIndexPath:我正在向自定义单元格的内容视图添加预定义的UIView(有几个子视图)。我之前为UIView及其子视图设置了所有约束。

最后但并非最不重要的是,我为自定义单元格(superview)的内容视图和之前添加的UIView(子视图)设置了垂直和水平约束。

约束字符串如下所示:

    H:|[view]|
    V:|[view]|

不幸的是,我仍然获得所有表格视图单元格的默认高度。我想知道是否有办法让自动布局根据内容大小自动计算高度。

4 个答案:

答案 0 :(得分:5)

在此处查看我对此问题的详细解答:https://stackoverflow.com/a/18746930/796419

设置需要一些工作,但你绝对可以让Auto Layout约束驱动一个完全动态的表视图,而不需要一个硬编码高度(并让约束求解器完成繁重的工作并为你提供行高)

答案 1 :(得分:2)

自动布局对单元格高度没有帮助。您需要在tableView:heightForRowAtIndexPath中进行设置。我想你可能会问这个因为你的细胞高度是可变的,而不是固定的。即,它们取决于内容。

要解决此问题,请预先计算单元格高度并将其存储在数组中。返回indexPath方法中相应tableView:heightForRowAtIndexPath的值。

请务必使用sizeThatFits类等UILabel计算主线程的内容大小。

如果您的计算是密集的,除了main等与视图相关的方法之外,请将其中的大部分关闭sizeThatFits

答案 2 :(得分:0)

我在CGSize size = [view systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];中使用tableView:heightForRowAtIndexPath:解决了这个问题。

答案 3 :(得分:0)

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

  • 分配并实施dataSource和委托
  • 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(&amp; line break mode = truncate tail)
  • 相对于其superview / cell容器设置所有约束(顶部,底部,右侧)。
  • 可选:如果您希望标签覆盖最小垂直区域,即使没有数据,也可以设置标签的最小高度。

enter image description here