如何在tableview Cell内设置tableView的自动高度?

Posted

技术标签:

【中文标题】如何在tableview Cell内设置tableView的自动高度?【英文标题】:How to set automatic height of tableView inside tableview Cell? 【发布时间】:2019-09-18 08:52:02 【问题描述】:

我有一个问题困扰了我一段时间。如何为另一个 tableview 单元格内的 tableview 设置自动高度?

所以我有 MainTableView,里面有 3 个单元格 (这个 tableview 有自动高度) 并且在 第 3 个单元格上我里面有另一个tableView (我们称它为SecondaryTableView,它对其父视图有约束)

前 2 个单元格是它工作的自动高度。

对于 SecondaryTableView 的设置,我尝试过相同的设置,但对于单元格,我选择了 xib 文件。

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
        tableView.dataSource = self
        tableView.delegate = self
        tableView.estimatedRowHeight = 900
        tableView.rowHeight = UITableView.automaticDimension
        registerCells()
    

    private func registerCells() 
        tableView.register(UINib(nibName: "MainCategorySectionTableViewCell", bundle: nil), forCellReuseIdentifier: "MainCategorySectionTableViewCell")
        tableView.register(UINib(nibName: "AdPerHomePageTableViewCell", bundle: nil), forCellReuseIdentifier: "AdPerHomePageTableViewCell")
    

我已经附上了一张关于它在模拟器中的外观的图片。绿色是第一个单元格,橙色是第二个单元格(那些已注册)。我滚动了一点前 2 个单元格以查看差异。

可能是单元格上没有数据?但是我贴了一些标签,看起来都一样

【问题讨论】:

内部单元格中将包含哪种类型的内容? 从 API 解析的数据 -> 图像和一些标签 而且高度也是动态的。对吗? 所以。父级是具有 3 个单元格的 tableView。 ( 1.cell -> 具有动态高度的集合视图 .... 2. 单元格 -> 普通视图固定高度 ... 现在是第 3 个单元格,我在其中包含了另一个 tableview,它将具有动态单元格跨度> 【参考方案1】:

您需要使用 UITableView 的intrinsicContentSize 变量。

为子tableView创建一个子类并覆盖 内在内容大小。

Dynamic row heights of a UITableView inside a UITableViewCell

【讨论】:

解决了我的问题。非常感谢 您好,我在 tableview 单元格中有 UITableview 我有像 Heading -> subHeading ->Detail 这样的 UI,当我点击标题时,它显示子标题,当点击子标题时它显示详细信息,但是当我快速滚动时,详细信息是不可见,但通常可以正常工作【参考方案2】:

您可能需要在每个包含 tableView 的单元格处设置一个闭包,一旦 tableView 完成重新加载数据,就会调用该闭包。 从您的父 tableView,只需捕获这些闭包,然后重新加载整个 tableView(或相应的部分)。

在你的主视图控制器中

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? YourTableViewCell else 
            return UITableViewCell()
        
        cell.onCompleteReloading =  [weak self] in 
            guard let self = self else  return 
            tableView.reloadSections([indexPath.section], animationStyle: .none)
        
        cell.setup()
        return cell
    

在你的 Cell 中,定义一个闭包

var onCompleteReloading:  (() -> Void)?

func setup() 
    // Do some stuff here
    // Then reload tableView
    self.reloadTableView()


func reloadTableView() 
    self.tableView.reloadData()
    self?.onCompleteReloading()

【讨论】:

你能举个合适的例子吗? 嘿。我已经尝试按照您在回答中所说的那样做,但没有成功。相同的显示。 请确保主控制器中的单元格已准备好进行动态高度。您能否分享有关您的代码的更多详细信息?

以上是关于如何在tableview Cell内设置tableView的自动高度?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 怎么避免tableview刷新数据错乱

iOS 如何设置tableview列表的cell上的的设置删除键 置顶按钮 未读信息按钮

iOS Table View Cell 自定义左滑按钮及事件(系统自带方法)

tableView的section和row

ios tableview 单选

如何在tableview Custom Cell上为UIView的左上角和右上角设置角半径?