嵌套的UITableView动态高度

时间:2018-02-23 04:31:52

标签: swift uitableview autolayout

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

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

我尝试了嵌套表视图的高度约束,我在tableview.contentsize.hight中创建了操作单元格,但似乎contentize根据每行的估计大小返回高度,但不是实际大小。 / p>

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

UITableView {

    override var contentSize:CGSize {
        didSet {
            self.invalidateIntrinsicContentSize()
        }
    }

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

什么都不能正常工作。有什么想法可以解决吗?

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

设置内部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