UITableViewController中的iOS tableHeaderView从未显示

时间:2019-05-23 13:13:39

标签: ios swift uitableview

我正在尝试在UITableViewController“ TBVC1”中为tableview实现tableViewHeader(而不是“ viewForHeaderInSection”)。

我尝试了两种解决方案(当然不起作用...):

1ST:在我的故事板中的UITableViewController顶部添加了一个UIView。如果我在此UILabel中添加UIView(带有约束等),并尝试显示我的View TBVC1...。完整视图为空。但是,如果删除插入在标题UIView中的UILabel,则可以看到所有单元格和headerView背景色...

您知道为什么我不能在此UIView中放置任何UI组件吗?

2ND:如果我尝试像这样加载特定的笔尖UIView

Bundle.main.loadNibNamed("Title", owner: nil, options: nil)!.first as! UIView
self.tableView.setTableHeaderView(headerView: customView)
self.tableView.updateHeaderViewFrame()



 extension UITableView {

/// Set table header view & add Auto layout.
func setTableHeaderView(headerView: UIView) {
    headerView.translatesAutoresizingMaskIntoConstraints = false

    // Set first.
    self.tableHeaderView = headerView

    // Then setup AutoLayout.
    headerView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    headerView.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
    headerView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
}

/// Update header view's frame.
func updateHeaderViewFrame() {
    guard let headerView = self.tableHeaderView else { return }

    // Update the size of the header based on its internal content.
    headerView.layoutIfNeeded()

    // ***Trigger table view to know that header should be updated.
    let header = self.tableHeaderView
    self.tableHeaderView = header
}
}

它也不起作用...我的完整视图为空...

您有任何想法为什么我无法在UILabel的{​​{1}}中显示简单的UIView吗?

1 个答案:

答案 0 :(得分:0)

我不确定自己的方式是否正确,但是每次设置tableHeaderView时,我也会手动设置其高度。

如果您想在tableHeaderView中使用自动布局,则可以在标题视图上调用systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)以获取计算出的大小并将高度分配给headerView。

您可以在Playground中尝试这个简单的示例。

import UIKit
import PlaygroundSupport

class MyViewController: UITableViewController {
    override func loadView() {
        super.loadView()

        let headerView = UIView()
        headerView.backgroundColor = .red

        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "Hello World!"
        label.textAlignment = .center
        label.textColor = .white

        headerView.addSubview(label)

        let attributes: [NSLayoutConstraint.Attribute] = [.leading, .top, .centerX, .centerY]
        NSLayoutConstraint.activate(attributes.map {
            NSLayoutConstraint(item: label, attribute: $0, relatedBy: .equal, toItem: headerView, attribute: $0, multiplier: 1, constant: 0)
        })
        // We have to set height manually, so use `systemLayoutSizeFitting` to get the layouted height
        headerView.frame.size.height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height

        tableView.tableHeaderView = headerView
    }
}

PlaygroundPage.current.liveView = MyViewController()