【问题标题】:UITableView within a UITableViewCell with dynamic height具有动态高度的 UITableViewCell 中的 UITableView
【发布时间】:2019-09-18 13:13:56
【问题描述】:

所以我正在尝试构建一些相当复杂的东西 - 可能比下图显示的要多。反正..

我正在尝试在父 UITableView 的单元格内添加一个 UITableView。这通常不是很复杂,但是,我需要包含嵌套 tableView 的单元格随着它所持有的 tableView 根据 它的 内容增长和缩小而动态调整大小。 不应允许嵌套的 tableView 在单元格内独立滚动。

我现在被困了一天又一天。我已经尝试了我能想到的所有东西,我在网上找到的所有东西,以及几乎所有关于 SO 的建议。

我尝试将 tableView 高度约束(并即时更新)链接到 tableView 的 contentSize。我认为这应该可行,但它没有(打破其他约束)。

任何解决此问题的建议或其他方法将不胜感激:)

红色明显是嵌套的tableView,蓝色是外层。如您所见,包含嵌套 tableView 的“单元格”已根据其内容调整大小。

【问题讨论】:

  • 你的怎么样?您的父表视图中的所有单元格是否具有相同的高度?或者具有另一个 tableview 的单元格具有不同的高度但仍然不符合您的需求?但是,如果您想要获得的内容类似于您在图像中显示的内容,我建议您使用部分而不是嵌套的表格视图。但如果你想要的是,你可以得到它
  • @Byron,通过 tableview 单元格内的 tableview 不是一个好方法。我认为,您想要实现的目标可以通过将 tableview 与多个部分保持一致来轻松完成。如果您在使用包含多个部分的 tableview 时遇到任何困难,请告诉我。
  • @Byron 最好使用带有多个部分的单个tableView,而不是使用嵌套的tableView。
  • @Byron,您的父 UITableView 应该为不同的单元格设置不同的部分,而不是将 tableview 嵌套在单元格内。对此要求采取一个部分,并根据帐户数据模型返回该部分中的单元格数,如果此部分的动态单元格大小,您可以使用行的高度,返回值为 UITableview.automaticDimension。

标签: ios uitableview


【解决方案1】:

你可以用 Observer 做,如果有效,请尝试

1.您必须添加到 tableview(在 tableCell 中)

yourTableView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.old, context: nil)

2。观察变化的方法

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

     //height can be use as cell height,
    let height = yourtableview.contentSize.height;
}

deinit {
     yourtableview.removeObserver(self, forKeyPath: "contentSize")
}

【讨论】:

  • 谢谢罗希特。我试过这个,它似乎打破了其他布局约束......我可以在创建视图时设置高度,但之后,就像在 KVO 观察者期间一样,它抱怨它不能同时满足约束。
【解决方案2】:

您应该在单元格中使用UIStackView 而不是UITableView,因为据我了解,内部 tableViews 不会滚动或出列。这将是对UITableView 的误用。 如果你已经有单元格或者你坚持,你可以在layoutSubviews内部tableview父视图的方法中设置内部tableview的高度约束,通过获取tableviews内容大小。

【讨论】:

    【解决方案3】:

    您可以继承UITableView 并根据其内容将其转换为“自动调整大小”的表格视图:

    final class ContentSizedTableView: UITableView {
        override var contentSize:CGSize {
            didSet {
                invalidateIntrinsicContentSize()
            }
        }
        override var intrinsicContentSize: CGSize {
            layoutIfNeeded()
            return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
        }
    }
    

    现在,表格视图的行为将与多行 UILabel 非常相似 --- 只需以相同的方式设置约束即可。

    两个音符:

    1) 在ContentSizedTableView 上禁用滚动 - 不是必需,但可能会是适合您的情况的更好的用户体验。

    2) 当您在原型单元格中进行布局时,它需要一个高度约束来满足 IB / Storyboard。因此,添加任一

    • >= 高度约束(因此即使没有行也有最小高度),或者
    • 给它一个“占位符”高度限制,或者
    • 给高度限制一个低优先级

    这是一个在滚动视图中使用ContentSizedTableView 的示例。同样的想法,并且应该明确如何使用它:

    https://stackoverflow.com/a/56840758/6257435

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2013-09-02
      • 2012-10-18
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多