我有一个“普通”样式的UITableView。我将视图设置为表视图的tableViewHeader
。该表还在右侧下方显示了部分索引。
我的问题是弄清楚如何在标题视图的左右边缘插入,以考虑在iPhone X(横向)上运行时安全区域插入和表视图的部分索引(如果有)。
我创建了一个简单的测试应用程序,其中添加了一些虚拟行,节标题和节索引。
这是我的使用UILabel创建简单标题视图的代码。我的真实应用不会使用标签,而是使用自定义视图。
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 30)
label.backgroundColor = .green
label.text = "This is a really long Table Header label to make sure it is working properly."
label.sizeToFit()
tableView.tableHeaderView = label
无需任何特殊尝试来固定左右边缘,iPhone X模拟器中的结果如下:
肖像:
景观:
请注意,单元格和节标题无需任何额外的努力即可获得所需的插图,而标题视图则不会。
我希望标题视图的左边缘与节标题和单元格的左边缘对齐。
我希望标题视图的右边缘停止在与节索引的左边缘相交的位置。请注意,肖像图片似乎已经完成了,但是如果您看上去很近,您可以说标题视图一直到表格视图的右边缘。您看不到省略号的第三个
.
,也几乎看不到节标题视图后面的绿色。我所做的一种尝试是将以下内容添加到我的表视图控制器中:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let header = tableView.tableHeaderView {
var insets = header.layoutMargins
insets.left = tableView.layoutMargins.left
insets.right = tableView.layoutMargins.right
header.layoutMargins = insets
}
}
该代码无效。
我应设置哪些属性以确保根据需要缩进标题视图的左右边缘?是否应该应用约束?
请注意,我正在用代码做所有事情。因此,请不要发布任何需要情节提要或Xib文件的解决方案。欢迎使用Swift或Objective-C回答。
对于任何想要复制此内容的人,请创建一个新的单视图项目。调整主情节提要以使用UITableViewController而不是计划UIViewController,并对
ViewController
使用以下内容:import UIKit
class ViewController: UITableViewController {
// MARK: - UITableViewController methods
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Row \(indexPath.row)"
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Section Header"
}
override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
let coll = UILocalizedIndexedCollation.current()
return coll.sectionIndexTitles
}
override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
return index
}
// MARK: - UIViewController methods
override func viewDidLoad() {
super.viewDidLoad()
tableView.sectionIndexMinimumDisplayRowCount = 1
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 30)
label.backgroundColor = .green
label.text = "This is a really long Table Header label to make sure it is working properly."
label.sizeToFit()
tableView.tableHeaderView = label
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let header = tableView.tableHeaderView {
var insets = header.layoutMargins
insets.left = tableView.layoutMargins.left
insets.right = tableView.layoutMargins.right
header.layoutMargins = insets
}
}
}
最佳答案
对于不带节索引的UITableViews:
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
label.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor)
])
对于具有部分索引的UITableViews:
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
label.trailingAnchor.constraint(equalTo: tableView.layoutMarginsGuide.trailingAnchor)
])