UITableViewAutomaticDimension 不适用于自定义表格单元格

Posted

技术标签:

【中文标题】UITableViewAutomaticDimension 不适用于自定义表格单元格【英文标题】:UITableViewAutomaticDimension not working with custom table cell 【发布时间】:2017-09-08 12:02:02 【问题描述】:

有很多问题回答 UITableView 的 UITableViewCell 的动态高度。但是我无法解决我的问题。

我有这个表格单元格创建代码:

class UINoteTabelViewCell: UITableViewCell 
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
    

    func fill(_ note: Note) 
        let view = UINote(withNote: note, atPoint: .zero)
        self.contentView.addSubview(view)
    

这就是我为表格视图创建单元格的方式:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "NotePreview", for: indexPath as IndexPath) as! UINoteTabelViewCell

        cell.fill(notes[indexPath.row] as! Note)
        return cell
    

表视图estimatedRowHeightrowHeight 也设置为UITableViewAutomaticDimension

但表格视图仍以 44.0 行高绘制。

我不知道如何解决它。

PS 我无法设置固定的estimatedRowHeight,因为每个单元格都有动态高度

【问题讨论】:

estimatedRowHeight 不应为 UITableViewAutomaticDimension。尝试将其设置为 100 并将 rowHeight 设置为 UITableViewAutomaticDimension。 UITableViewAutomaticDimension 与约束一起使用,您需要添加适当的约束,单元格可以通过该约束来计算其高度 确保您的标签编号为零行 尝试将tableView.rowHeight = UITableViewAutomaticDimension 写入cellForRowAtIndexPath 【参考方案1】:

自动高度适用于计算单元格的contentView 高度。因此,您必须添加将用于计算其实际高度的约束。

试试这个:

class UINoteTabelViewCell: UITableViewCell 
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
    

    func fill(_ note: Note) 
        let view = UINote(withNote: note, atPoint: .zero)
        self.contentView.addSubview(view)

        // this will make the difference to calculate it based on view's size:
        view.translatesAutoresizingMaskIntoConstraints = false
        view.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
        view.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
        view.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
        view.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
    

此外,estimatedRowHeight 应设置为一个特定值,该值可以近似估计所有单元格的大小。但这不是问题。

【讨论】:

【参考方案2】:

我可以看到您只是在单元格 contentView 上添加 NoteView。您还应该在笔记视图上应用自动布局约束,例如前导、尾随、顶部和底部。 如果您在便笺视图上应用正确的自动布局约束,希望它会起作用。

【讨论】:

【参考方案3】:

你应该给 estimatedRowHeight 一些默认值,比如 60。 然后行的默认高度将是 60,但是当内容需要高度超过 60 时 UITableViewAutomaticDimension 将起作用。

【讨论】:

以上是关于UITableViewAutomaticDimension 不适用于自定义表格单元格的主要内容,如果未能解决你的问题,请参考以下文章