嵌套的UITableView动态高度 [英] Nested UITableView dynamic height

查看:205
本文介绍了嵌套的UITableView动态高度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

UITableView {

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

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

一切正常.有什么想法可以解决吗?

先谢谢您.

解决方案

设置内部表格视图我的自定义类AGTableView和height Constraint都是必需的,

此类设置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

I need to have a nested UITableView in a tableView cell (actually, two tables in one cell) to show different lists with dynamic content (so, I need dynamic heights). My nested tables will not have scrolling—I need them just to order elements of different kinds, like texts, pictures, fields etc. To be more clear—the first level is the level of operations and every operation can have a variable amount of instructions and actions. Instructions and actions should be placed side by side and the operation cell should have the size of the tallest table.

There are no problems in nesting tables, but I faced a problem with the auto layout. I’ve tried everything that I could find, but with no success.

I tried height constraints for nested table views, which I update on the operation cell creation from tableview.contentsize.hight, but it seems that contentsize returns height based on the estimated size of every row, but not the actual size.

I tried to rewrite intrinsic content size of nested tables:

UITableView {

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

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

Nothing works properly. Any ideas how it could be solved?

Thank you in advance.

解决方案

Set Inner tableview my custom class AGTableView and height Constraint both are required,

this class set contantSize same table view height Constraint.

Check out 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
                }
            }
        }
    }
}

NOTE: Also set a estimatedRowHeight

self.rowHeight = UITableViewAutomaticDimension
self.estimatedRowHeight = height

这篇关于嵌套的UITableView动态高度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆