微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将具有多个单元格的 UITableView 嵌入到 UITableViewCell 中并使 automaticDimension 正常工作?

如何解决如何将具有多个单元格的 UITableView 嵌入到 UITableViewCell 中并使 automaticDimension 正常工作?

我有一个自定义单元格类 (TripMatrixCell),其变量为 tripMatrixViewController。

    class TripMatrixCell: UITableViewCell {
        var tripMatrixViewController: TripMatrixViewController! {
            didSet {
                contentView.addSubview(tripMatrixViewController.view)
                tripMatrixViewController.view.pinToSuperview()
            }
        }
    }

tripMatrixViewController 是一个带有自定义 tableView 的 UIViewController,其中包含其他自定义单元格 (TwoColumnCondensedTripCell)。这是自定义 tableView 类,它将容纳 TwoColumnCondensedTripCells:

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

这个tableView设置在这里,在TripMatrixViewController中:

    override public func viewDidLoad() {
        super.viewDidLoad()
        bind()
    }
    
    func bind() {
        tableView = ContentSizedTableView(frame: view.frame,style: .plain)
        tableView.delegate = self
        tableView.dataSource = self
        view.addSubview(tableView)
        tableView.pinToSuperview()
    
        tableView.register(TwoColumnCondensedTripCell.nib,forCellReuseIdentifier: TwoColumnCondensedTripCell.reuseIdentifier)
    
        tableView.tableHeaderView = UIView(frame: CGRect.zero)
        tableView.tableFooterView = UIView(frame: CGRect.zero)
        tableView.backgroundColor = .clear
        tableView.separatorStyle = .none
        tableView.estimatedRowHeight = 167.0
        tableView.rowHeight = UITableView.automaticDimension
        tableView.clipsToBounds = false
        tableView.isScrollEnabled = allowsScrolling
    }
    
    public func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

每当设置了 TripMatrixCells 的 tripMatrixViewController 变量时,它的视图(包含带有 TwoColumnCondensedTripCells 行的自定义 tableView)被添加为单元格 contentView 的子视图,然后被 pinnedToSuperview。这里是 pinToSuperview 方法

    func pinToSuperview() {
        if let superview = superview {
            self.pinToView(superview)
        }
    }
    
    func pinToView(_ view: UIView) {
        self.translatesAutoresizingMaskIntoConstraints = false
        self.pinToView(view,insets: UIEdgeInsets.zero)
    }
    
    func pinToView(_ view: UIView,insets: UIEdgeInsets) {
        self.translatesAutoresizingMaskIntoConstraints = false
        superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .top,relatedBy: .equal,toItem: view,multiplier: 1.0,constant: insets.top))
        superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .bottom,constant: -insets.bottom))
        superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .left,constant: insets.left))
        superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .right,constant: -insets.right))
    }

我尝试使用此 TripMatrixCell 填充 UITableView,但是,包含此 TripMatrixCell 的行的高度不准确,并且单元格的底部被截断。在下面的屏幕截图中,TripMatrixCell 背景为黑色,其子视图(TwoColumnCondensedTripCells)由白色矩形表示,其中底部两个因行高未正确计算而被截断。

enter image description here

以下是设置试图显示 TripMatrixCell 的 tableView 的方法

    override public func viewDidLoad() {
        super.viewDidLoad()
    
        bind()
    
        refreshControl = refreshController?.refreshControl
        refreshController?.refresh()
    }
    
    func bind() {
        tableView = UITableView(frame: view.frame,style: .grouped)
        tableView.pinToSuperview()
    
        tableView.register(TripMatrixCell.nib,forCellReuseIdentifier: TripMatrixCell.reuseIdentifier)
    
        tableView.tableFooterView = UIView()
        tableView.backgroundColor = .clear
        tableView.separatorStyle = .none
        tableView.estimatedRowHeight = 167.0
        tableView.rowHeight = UITableView.automaticDimension
    }

    override public func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

如果我在 viewDidAppear 中调用 tableView.beginUpdates() 和 tableView.endUpdates(),我可以让单元格的高度正确加载,但问题是用户可以看到更新发生。

如何在第一遍中正确计算单元格的高度?我已经浏览了十几篇不同的帖子和文章来寻找解决方案,但到目前为止我所实施的一切都没有奏效。我希望我把事情安排得很清楚,而不会添加太多不必要的代码。如果没有,我准备在需要时提供更多信息。我已经花了十几个小时试图解决这个问题并感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。