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

Posted

技术标签:

【中文标题】UITableView 的 tableViewHeader 和 tableViewCells 重叠,直到调用 reloadData【英文标题】:UITableView's tableViewHeader and tableViewCells overlapping until reloadData is called 【发布时间】:2017-04-12 13:10:11 【问题描述】:

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

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

当我加载视图控制器时,由于 API 调用正在进行中,我可以很简单地看到 topSection(即 UITableView.tableViewHeader)坐在 UITableViewCells 后面。然后,当在我的didSet 中调用reloadData 来呈现表格视图时,一切都会正确布局。

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

我还尝试将topSectiontop 限制为tableView 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

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

【问题讨论】:

AFAIK,表视图标题的默认行为是在视图顶部。单元格在其下方滚动。如果您不希望这种行为,请不要将上述视图用作标题视图。分开 我相信你在想UITableViewHeaderFooterView。例如,在“通讯录”应用程序中,它是带有“A”、“B”等的灰色条。 UITableView.tableViewHeader 是一个位于 UIScrollView 中所有部分之上的视图,它本质上是表格视图的一部分 【参考方案1】:

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

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

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

【讨论】:

感谢 DonMag!结果发生的一件小事是,我的 UILabel 的 numberOfLines 属性等于 0、左边距和宽度不再换行,它只是从视图的左侧流出。似乎是这个的副作用 cl.ly/181p1D3a0X3J (在前面添加 https://,由于某种原因不允许我发布链接)。除了numberOfLines = 0之外,它还有一个Title的left约束(“Nike”),一个Title的bottom + 4的top Constraint和一个superview.width * 80%的宽度 那是标题视图的一部分吗?还是一个单元格/行?您是否尝试过 Debug Hierarchy 来查看是否缺少任何约束或未正确计算? 它是tableViewHeader 的一部分。它只是视图中布置的另一个对象。我来看看 Debug Hierarchy 解决了。感谢您的帮助 DonMag

以上是关于UITableView 的 tableViewHeader 和 tableViewCells 重叠,直到调用 reloadData的主要内容,如果未能解决你的问题,请参考以下文章

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

水平 UITableView 中的垂直 UITableView

将 UITableView 推送到 UITableView

如何与重叠显示的 UITableView 交互另一个 UITableView

UITableView

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据