UITableViewCell 内 UITableView 的动态行高

Posted

技术标签:

【中文标题】UITableViewCell 内 UITableView 的动态行高【英文标题】:Dynamic row heights of a UITableView inside a UITableViewCell 【发布时间】:2018-02-07 15:43:12 【问题描述】:

我有一个“主”UITableView,我在其中使用从 .xib 加载的不同单元格。其中一些单元格本身也有一个 UITableView。

现在我已将每个单元格的行高设置为原始 xib 大小。但是,我希望高度动态并与“子”UITableView 中的行数相对应。

我遇到了以下问题:

加载 ViewController 后,主 UITableView 需要为其拥有的每个单元格设置一个高度。 当需要这个高度时,子 UITableView 还没有加载自己的单元格,因此还不是合适的大小。

我尝试了以下方法:

首先,使用“估计”高度加载单元格 单元格加载自己的tableView并调用刷新主tableView

但是,在这种情况下,单元格将使用“估计的”高度来布置自己的行。因此它总是太大或太小。

我该如何解决这个问题?

【问题讨论】:

为什么要使用嵌套表视图?您可以拥有一个具有多种单元格类型的主 UITableView,并拥有一个代表您想要的行为的数据模型。嵌套的 tableViews 总是很难处理... 但对于自动高度单元格,请查看此链接:raywenderlich.com/129059/self-sizing-table-view-cells 不仅仅是“难以处理”,直接建议不要使用嵌套表视图。任何时候你有嵌套视图竞争手势识别器,即表格拖动,你有一个 UI 灾难的秘诀。我所见过的大量使用的应用程序都没有嵌套表视图。利用分段并考虑显示数据的其他方式。 我使用了嵌套的 TableViews,因为有些部分更适合它们自己的 xib,而不是单元格中的所有内容。有一些相当复杂的动画正在进行。 【参考方案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()
        
    
    

    在 Interface builder 中,将子 tableView 的类更改为 MyOwnTableView(子类 UITableView)。

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

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

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

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

【讨论】:

你会在哪里设置 self.tableviewHeight.constant? @Learner 我正在尝试你的第二种方法,但我被卡住了,因为我无法接收到 innertableviewcell 的高度。 cell.constraintHeightOfTblView.constant = CGFloat(135 * (cell.arrCourses.count))【参考方案2】:

您可以创建一个对象,该对象将创建您想要放入单元格的类的模板对象,将数据放入其中,计算其大小并将其返回到主 tableView 的 sizeForItem 方法。这样您就可以在主 tableView 准备数据时设置返回的计算大小。 这就是我在项目中的做法。 您可以使用缓存改进此对象,使其通用并在您可能需要的任何地方使用。

【讨论】:

我该怎么做你能分享一些代码。因为我真的被困在我的内部表格视图单元格中,我不希望它恭敬地滚动。

以上是关于UITableViewCell 内 UITableView 的动态行高的主要内容,如果未能解决你的问题,请参考以下文章

保存后 UITableViewCell 和 Coredata 上的 UIImage 的方向发生了变化

如何将文本包装在 Iphone 的 UITable 单元格中?

在 cellForRowAtIndexPath 中返回不同的 UITableViewCell 类型

将 IBOutlets 连接到 UITableViewCell 原型

UITableViewCell 未在其中显示 UILabel

UITableViewCell:图片出现在 Cell View 后面