【问题标题】:iOS tableHeaderView in UITableViewController never displayedUITableViewController 中的 iOS tableHeaderView 从不显示
【发布时间】: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

【问题讨论】:

    标签: ios swift uitableview


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2021-10-06
      相关资源
      最近更新 更多