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 中的 iOS tableHeaderView 从不显示
框架中的 UITableViewController 未调用 didSelectRowAtIndexPath