【问题标题】:Using constraints with tableHeaderView of UITableView, tableHeaderView appears on top of cells使用 UITableView 的 tableHeaderView 约束,tableHeaderView 出现在单元格顶部
【发布时间】:2021-08-20 03:45:48
【问题描述】:

我正在使用约束和自动布局创建自定义 tableHeaderView。问题是我的 tableHeaderView 出现在单元格的顶部。

这是我的 viewDidLoad:

let tableView = UITableView()
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

//Adding subviews and setting constraints
let headerContainer = UIView()
let myView = UIView()
headerContainer.addSubview(myView)
//Setup constraints...

let myLabel = UILabel()
headerContainer.addSubview(myLabel)
//Adding many more views...

tableView.setAndLayoutTableHeaderView(header: headerContainer)

阅读这篇文章,我已将建议的扩展复制到 UITableView:Is it possible to use AutoLayout with UITableView's tableHeaderView?

extension UITableView {
    //set the tableHeaderView so that the required height can be determined, update the header's frame and set it again
    func setAndLayoutTableHeaderView(header: UIView) {
        self.tableHeaderView = header
        header.setNeedsLayout()
        header.layoutIfNeeded()
        print(header.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height) //Always 0???
        header.frame.size = header.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
        self.tableHeaderView = header
    }
}

问题是标题视图出现在单元格的顶部。在 layoutIfNeeded 和 setNeedsLayout 之后打印 headerContainer 的大小时,高度为 0...

【问题讨论】:

  • "使用约束和自动布局创建自定义 tableHeaderView" 不要。表头视图的位置取决于表视图,而不是你。你在阻挠框架。并且从未实现表头视图的自动调整大小(我对此有一个长期存在的错误)。
  • 嘿,matt,那么在添加了所有视图和文本之后,如何计算 tableHeaderView 的适当高度?请记住,我有多线 UILabel,所以高度是动态的。
  • 您可以使用内部约束并调用systemLayoutSizeFitting 并将标题视图的高度设置为该值,但是您必须再次设置标题视图以便表格视图听到更改和更改高度。每当标签文本更改时,您都必须这样做。这将是一个非常不愉快的界面;表头视图实际上不是为那种东西设置的。我建议你改变整个界面架构。
  • 我在上面的扩展中调用了systemLayoutSizeFitting。奇怪的是,建议的高度总是 0。我尝试使用滚动视图来实现我自己的策略,考虑到管理滚动视图和滚动视图内的表格视图的滚动听起来像是一场噩梦。
  • 我没有看到您将表格宽度考虑在内。也许我错过了什么......

标签: ios swift uitableview uikit


【解决方案1】:

当您自己维护框架时,可以简化为这样。

extension UITableView {

    func setAndLayoutTableHeaderView(header: UIView) {
        header.frame.size = header.systemLayoutSizeFitting(size: CGSize(width: self.frame.size.with, height: .greatestFiniteMagnitude))
        self.tableHeaderView = header
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多