【问题标题】:iOS Auto-Layout: Dynamic height for table view celliOS自动布局:表格视图单元格的动态高度
【发布时间】:2013-05-16 11:47:48
【问题描述】:

我有一个包含一堆单元格的表格视图(自定义单元格,只有它的内容视图)。

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

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

约束字符串如下所示:

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

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

【问题讨论】:

  • 没有。您需要实现tableView:heightForRowAtIndexPath并返回一个高度,否则将使用单元格的默认高度。
  • 有没有办法让视图决定它应该得到哪个高度?
  • 如果您使用自定义UITableViewCells,您可以在子类中创建一个返回该单元格高度的方法,然后在tableView:heightForRowAtIndexPath 中调用该方法。显然,尽量让计算快速高效(如果计算非常复杂,可能会预先计算任何更改的结果并缓存结果)。
  • 感谢您的回答。不幸的是,计算单元格内容对我来说不是解决方案。问题是,我不知道视图里面是什么。
  • 也许在未来的 iOS 版本中,他们会更新 tableview 单元格的工作方式,但是(从 iOS 6 开始)您需要混合使用这两种方法。祝你的应用好运。

标签: ios uitableview autolayout nslayoutconstraint row-height


【解决方案1】:

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

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

请务必在主线程上使用 sizeThatFitsUILabel 类等计算内容大小。

如果您的计算量很大,请在main 上完成大部分计算,除了sizeThatFits 等与视图相关的方法。

【讨论】:

    【解决方案2】:

    在这里查看我对这个问题的详细回答:https://stackoverflow.com/a/18746930/796419

    设置需要一些工作,但是您绝对可以使用自动布局约束来驱动完全动态的表格视图,而无需单一的硬编码高度(让约束求解器完成繁重的工作并为您提供行高) .

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        要为行高设置自动尺寸,请确保按照以下步骤制作,自动尺寸对单元格/行高布局有效。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多