UITableViewCell内UITableView的动态行高

4
我有一个“主”UITableView,其中我使用从.xib中加载的不同单元格。其中一些单元格本身也有一个UITableView。
目前,我将每个单元格的行高设置为原始xib大小。然而,我希望高度是动态的,并与“子”UITableView中的行数相对应。
我遇到了以下问题:
1. 在ViewController加载时,主UITableView需要每个单元格的高度。 2. 到需要这个高度的时候,子UITableView还没有加载自己的单元格,因此尺寸还不正确。
我尝试了以下方法:
1. 首先,使用“估计”的高度加载单元格。 2. 单元格加载自己的tableView并调用以刷新主tableView。
然而,在这种情况下,单元格将使用“估计”的高度来布置其自己的行。因此,它总是太大或太小。
如何解决这个问题?

1
为什么要使用嵌套的表视图?你可以使用一个主UITableView,其中包含多个单元格类型,并拥有代表所需行为的数据模型。嵌套的tableView始终很难处理... - heyfrank
但是,如果要自动调整单元格的高度,请查看以下链接: https://www.raywenderlich.com/129059/self-sizing-table-view-cells - heyfrank
嵌套表视图不仅难以处理,而且直接被建议避免使用。每当您有竞争手势识别器的嵌套视图时,例如表拖动,您就会面临 UI 灾难的风险。我见过的任何一个广泛使用的应用程序都没有嵌套表视图。利用分组并考虑替代显示数据的方式。 - Connor Neville
我使用了嵌套的TableViews,因为有些部分更适合在自己的xib中,而不是所有东西都在单元格中。有一些相当复杂的动画正在进行中。 - knart
2个回答

13

第一种方法:

  1. 创建一个子类用于子tableView,并覆盖intrinsicContentSize函数。

     class MyOwnTableView: UITableView {
    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return self.contentSize
    }

    override var contentSize: CGSize {
        didSet{
            self.invalidateIntrinsicContentSize()
        }
    }

    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }
}
  • 在界面构建器中,将子表视图的类更改为MyOwnTableView(子类UITableView)。

  • 为父表视图和子表视图都设置自动行高。

  •     tableView.estimatedRowHeight = 60.0;
        tableView.rowHeight = UITableViewAutomaticDimension;
    

    第二种方法: 1. 创建一个高度约束,为子tableView设置任何值,并连接一个IBOutlet来设置子tableView的高度。 2. 将高度约束的常数设置为tableView.contentSize.height。

        self.tableViewHeight.constant = self.tableView.contentSize.height
    

    5
    你会把 self.tableviewHeight.constant 设置在哪里? - jailani
    @Learner 我正在尝试你的第二种方法,但我卡住了,因为我无法接收到innertableviewcell的高度。 cell.constraintHeightOfTblView.constant = CGFloat(135 * (cell.arrCourses.count)) - Muju
    第一种方法更加复杂。只是缺少一点小东西:在“contentSize”属性的didSet中调用layoutIfNeeded(),这将在显示之前正确计算单元格的大小。 - Muhammad Umair

    2

    您可以创建一个对象,它将创建您想要放在单元格中的类的模板对象,将数据放入其中,计算其大小,并在主tableView的sizeForItem方法中返回它。这样,您就可以在主tableView准备数据时设置返回的计算大小。


    这是我在我的项目中使用的方法。


    您可以改进此对象并使用缓存,使其通用,并在可能需要的任何地方使用。


    我该怎么做?你能分享一些代码吗?因为我的内部表格视图单元格滚动有所不同,我不想让它有所不同。 - Muju

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接