【问题标题】:Dynamic row heights of a UITableView inside a UITableViewCellUITableViewCell 内 UITableView 的动态行高
【发布时间】: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,而不是单元格中的所有内容。有一些相当复杂的动画正在进行。

标签: ios uitableview


【解决方案1】:

第一种方法:

  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()
        }
    }
    
  2. 在 Interface builder 中,将子 tableView 的类更改为 MyOwnTableView(子类 UITableView)。

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

        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 准备数据时设置返回的计算大小。
这就是我在项目中的做法。
您可以使用缓存改进此对象,使其通用并在您可能需要的任何地方使用。

【讨论】:

  • 我该怎么做你能分享一些代码。因为我真的被困在我的内部表格视图单元格中,我不希望它恭敬地滚动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多