Ios 具有动态高度的UITableViewCell中的UITableView

Ios 具有动态高度的UITableViewCell中的UITableView,ios,uitableview,Ios,Uitableview,因此,我试图构建一些相当复杂的东西——可能比下图所示的要复杂得多。无论如何 我正试图在父级的单元格内设置一个UITableView。这通常不是很复杂,但是,我需要包含嵌套tableView的单元格在它所持有的tableView根据其内容增长和收缩时动态调整大小。 嵌套的tableView不允许在单元格内独立滚动 我已经被困了一天半了。我已经尝试了我能想到的一切,我在网上找到的一切,以及这里几乎所有的建议 我尝试将tableView高度约束链接(并动态更新)到tableView的contentSi

因此,我试图构建一些相当复杂的东西——可能比下图所示的要复杂得多。无论如何

我正试图在父级的单元格内设置一个
UITableView
。这通常不是很复杂,但是,我需要包含嵌套tableView的单元格在它所持有的tableView根据其内容增长和收缩时动态调整大小。 嵌套的tableView不允许在单元格内独立滚动

我已经被困了一天半了。我已经尝试了我能想到的一切,我在网上找到的一切,以及这里几乎所有的建议

我尝试将tableView高度约束链接(并动态更新)到tableView的contentSize。我认为这应该行得通,但它没有(打破了其他限制)

如有任何建议或其他方法,我们将不胜感激:)

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


您可以使用Observer,如果它有效,请尝试

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")
}
1。您必须添加到tableview(位于tableCell中)

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")
}

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

您可以将
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/情节提要。因此,添加其中一个

  • =
    高度约束(因此即使没有行,也有最小高度),或
  • 为其设置“占位符”高度约束,或
  • 将高度约束设置为低优先级
下面是一个在滚动视图中使用
ContentSizedTableView
的示例。同样的想法,并且应该明确如何使用它:


你的看起来怎么样?父表视图中的所有单元格是否具有相同的高度?或者具有另一个tableview的单元格具有不同的高度,但仍然不符合您的要求?但是,如果您希望得到的内容与图像中显示的内容类似,我建议您使用节而不是嵌套的TableView。但如果你想这样,你可以it@Byron,这不是在tableview单元格内通过tableview的好方法。我认为,通过将tableview保留在多个部分中,可以轻松实现您想要实现的目标。如果您在使用多个分区的tableview时遇到任何困难,请告诉我。@Byron最好使用多个分区的单个tableview,而不是使用嵌套的tableview。@Byron,您的父UITableView应该为不同的单元格设置不同的分区,而不是将tableview嵌套在单元格内。针对此要求选取一个部分,并根据帐户数据模型返回该部分中的单元格数量,您可以使用“使用高度”作为行,返回值为UITableview.automaticDimension(如果此部分的单元格大小为动态)。感谢Rohit。我试过这个,它似乎打破了其他布局限制。。。我可以在创建视图时设置高度,但之后,就像在KVO观察者中一样,它会抱怨无法同时满足约束。