UITableView 的 tableViewHeader 和 tableViewCells 重叠,直到调用 reloadData

Zac*_*iro 1 uitableview ios autolayout uicollectionview swift

我有一个表格视图,其中有tableViewHeader一个充满单元格的部分。

在创建 之前UITableView,我创建了一个名为 的视图topSection,该视图具有视图的宽度和基于从 API 返回的文本的可变高度。

当我加载视图控制器时,由于 API 调用正在进行中,我可以非常简短地看到topSection(即UITableView.tableViewHeader)位于UITableViewCells. 然后,当reloadData在 my 中调用didSet来渲染表视图时,一切都会正确布局。

topSection在将其添加到之前,我不会以任何方式对其进行限制UITableView

我也尝试将 the 限制toptopSectionthetableView top但那也不起作用。

let listingsTableView = UITableView()
    listingsTableView.backgroundColor = .white
    listingsTableView.dataSource = self
    listingsTableView.delegate = self
    listingsTableView.rowHeight = 78
    listingsTableView.bounces = false
    listingsTableView.allowsSelection = false
    listingsTableView.tableHeaderView = topSection
    listingsTableView.register(ListingsHeaderView.self, forHeaderFooterViewReuseIdentifier: "HeaderView")
    listingsTableView.register(ListingsTableViewCell.self, forCellReuseIdentifier: "ListingsCell")
    view.addSubview(listingsTableView)

    constrain(listingsTableView, topSection) { tableview, topSection in
        tableview.top == tableview.superview!.top
        tableview.left == tableview.superview!.left
        tableview.right == tableview.superview!.right
        tableview.bottom == tableview.superview!.bottom
    }
    self.listingsTableView = listingsTableView
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。谢谢!

Don*_*Mag 6

我认为您遇到了一个常见问题 - 表格不会在没有一点提示的情况下“自动调整”标题视图的大小。

尝试将其添加到您的代码中(您可能需要更改视图引用...):

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

func sizeHeaderToFit() {
    let headerView = theTableView.tableHeaderView!

    headerView.setNeedsLayout()
    headerView.layoutIfNeeded()

    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height

    var frame = headerView.frame
    frame.size.height = height
    headerView.frame = frame

    theTableView.tableHeaderView = headerView
}
Run Code Online (Sandbox Code Playgroud)