UITableViewController 中的 iOS tableHeaderView 从不显示

Posted

技术标签:

【中文标题】UITableViewController 中的 iOS tableHeaderView 从不显示【英文标题】:iOS tableHeaderView in UITableViewController never displayed 【发布时间】:2019-05-23 13:13:39 【问题描述】:

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

我尝试了两种解决方案(当然不行……):

1ST:在我的故事板中的UITableViewController 顶部添加了一个 UIView。如果我在这个UIView 中添加一个UILabel(带有约束等),并尝试显示我的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


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

你有什么想法为什么我没有成功在我的UIView 中为tableViewheader 显示一个简单的UILabel

【问题讨论】:

【参考方案1】:

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

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

您可以在 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()

【讨论】:

以上是关于UITableViewController 中的 iOS tableHeaderView 从不显示的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewController 中的 iAd

UITableViewController 中的 iOS tableHeaderView 从不显示

UITableViewController 中的顶栏背景

框架中的 UITableViewController 未调用 didSelectRowAtIndexPath

从 UITableViewController 中的按钮创建操作

在 UITableViewController 中的 UITableViewCells 之间进行通信