嵌套 UITableView 动态高度

Posted

技术标签:

【中文标题】嵌套 UITableView 动态高度【英文标题】:Nested UITableView dynamic height 【发布时间】:2018-02-23 04:31:51 【问题描述】:

我需要在 tableView 单元格中有一个嵌套的 UITableView(实际上,一个单元格中有两个表格)以显示具有动态内容的不同列表(因此,我需要动态高度)。我的嵌套表格不会滚动——我只需要它们来排序不同类型的元素,比如文本、图片、字段等。更清楚一点——第一级是操作级别,每个操作都可以有可变数量的指令和行动。指令和操作应并排放置,操作单元格应与最高桌子的大小相同。

嵌套表格没有问题,但我遇到了自动布局的问题。我已经尝试了所有能找到的方法,但都没有成功。

我尝试了嵌套表格视图的高度限制,我从 tableview.contentsize.hight 更新操作单元格创建,但似乎 contentsize 根据每行的估计大小返回高度,而不是实际大小。

我试图重写嵌套表的内在内容大小:

UITableView 

    override var contentSize:CGSize 
        didSet 
            self.invalidateIntrinsicContentSize()
        
    

    override var intrinsicContentSize: CGSize 
        self.layoutIfNeeded()
        return CGSize(width: UIViewNoIntrinsicMetric, height: contentSize.height)
    

一切正常。任何想法如何解决?

提前谢谢你。

【问题讨论】:

【参考方案1】:

Set Inner tableview 我的自定义类AGTableView 和高度约束都是必需的,

这个类设置contantSize同表视图高度约束。

查看 Github AutoHeightIncrementTableViewDemo

class AGTableView: UITableView 

    fileprivate var heightConstraint: NSLayoutConstraint!

    override init(frame: CGRect, style: UITableViewStyle) 
        super.init(frame: frame, style: style)
        self.associateConstraints()
        defaultInit()
    

    required public init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.associateConstraints()
        defaultInit()
    

    func defaultInit()
        self.keyboardDismissMode = .onDrag
        self.showsVerticalScrollIndicator = false
        self.showsHorizontalScrollIndicator = false
        self.tableFooterView = UIView(frame: .zero)
        self.tableHeaderView = UIView(frame: .zero)
        self.sectionFooterHeight = 0
        self.sectionHeaderHeight = 0
    

    override open func layoutSubviews() 
        super.layoutSubviews()

        if self.heightConstraint != nil 
            self.heightConstraint.constant = self.contentSize.height
        
        else
            print("Set a heightConstraint to set cocontentSize with same")
        
    

    func associateConstraints() 
        // iterate through all text view's constraints and identify
        // height

        for constraint: NSLayoutConstraint in constraints 
            if constraint.firstAttribute == .height 
                if constraint.relation == .equal 
                    heightConstraint = constraint
                
            
        
    

注意:还要设置estimatedRowHeight

self.rowHeight = UITableViewAutomaticDimension
self.estimatedRowHeight = height

【讨论】:

感谢您的回答。您能否澄清一下——我需要对外部 tableView(或其单元格)做些什么吗? 使外部表格视图单元格大小自动增加。并在内部 tableview 中设置此类。 此类设置表格视图的高度,与您的表格视图内容大小相同。 不能让它工作 :-( 似乎我错过了一些东西。hight 不断更新,但我想外面的单元格已经晚了。你能看看github.com/AlexChekanov/TaskCard-Table-in-Table 吗?这是您的解决方案的设置。 有效!谢谢!你拯救了我的一天(甚至三天:-)

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

设置 tableviewcell 高度以显示具有动态高度单元格的完整内部/嵌套 uitableview

根据内容动态设置 UIScrollView 高度和 UITableView 高度

如何根据 UITableView 滚动动态调整 UITableViewCell 的大小?

UITableView 不可滚动但足够高

动态调整 UITableView 高度

获取 UITableView 动态高度的最佳方法是啥?