将标签添加到tableview后,需要向标签添加一些自动布局约束:
â¦
tableView.tableHeaderView = label
//Add this
label.translatesAutoresizingMaskIntoConstraints = false
label.leadingAnchor.constraint(equalTo: (label.superview?.safeAreaLayoutGuide.leadingAnchor)!).isActive = true
label.trailingAnchor.constraint(equalTo: (label.superview?.safeAreaLayoutGuide.trailingAnchor)!).isActive = true
label.numberOfLines = 0
.
viewDidLayoutSubviews
.
更新:
为了好玩,我在操场上做了一些实验,发现使用
layoutMarginsGuide
aCell.contentView.bounds.width
,减去表视图的宽度并将结果除以2,标题标签将非常好地位于节索引旁边。因此,我编写了一个用于设置约束的辅助函数。表视图是可选的,因此该函数可以与任何具有superview且需要保持在安全区域内的视图一起使用。如果传入了表视图,则它可以有或没有节索引,但它确实需要在第0行第0节至少有一个单元格:
func constrain(view: UIView, inTableView aTableView: UITableView?) {
guard let container = view.superview else {
print("Constrain error! View must have a superview to be constrained!!")
return
}
view.translatesAutoresizingMaskIntoConstraints = false
view.leadingAnchor.constraint(equalTo: container.safeAreaLayoutGuide.leadingAnchor).isActive = true
if let table = aTableView, let aCell = table.cellForRow(at: IndexPath(row: 0, section: 0)) {
let tableWidth = table.bounds.width
let cellWidth = aCell.contentView.bounds.width
view.trailingAnchor.constraint(equalTo: table.safeAreaLayoutGuide.trailingAnchor, constant: cellWidth - tableWidth).isActive = true
} else {
view.trailingAnchor.constraint(equalTo: container.safeAreaLayoutGuide.trailingAnchor).isActive = true
}
}
我在使用这个时确实发现了一个问题。在文本中使用设置为0行的标签时,它会覆盖第一节标题和该节的第一个单元格。也需要一些滚动才能将它们从标题下取出。不过,将标签剪切到一行效果很好。