Exemple 2019 complet à copier et coller
Commencez par définir "Groupé" sur le storyboard: cela doit se produire au moment de l'initialisation, vous ne pouvez pas vraiment le définir plus tard, il est donc plus facile de se souvenir de le faire sur le storyboard:

Prochain,
Doit implémenter heightForHeaderInSection en raison d'un bogue Apple.
func tableView(_ tableView: UITableView,
heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat(70.0)
}
Il y a toujours un bogue Apple - depuis dix ans maintenant - où il n'affiche tout simplement pas le premier en-tête (c'est-à-dire l'index 0) si vous n'avez pas heightForHeaderInSection appel.
Donc, tableView.sectionHeaderHeight = 70ça ne marche tout simplement pas, c'est cassé .
Définir un cadre ne sert à rien:
Dans viewForHeaderInSection créez simplement un UIView ().
C'est inutile / n'apporte rien si vous UIView (frame ...) car iOS définit simplement la taille de la vue comme déterminé par le tableau.
Donc, la première ligne de viewForHeaderInSectionsera simplement let view = UIView()et c'est la vue que vous retournez.
func tableView(_ tableView: UITableView,
viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
let l = UILabel()
view.addSubview(l)
l.bindEdgesToSuperview()
l.backgroundColor = .systemOrange
l.font = UIFont.systemFont(ofSize: 15)
l.textColor = .yourClientsFavoriteColor
switch section {
case 0:
l.text = "First section on screen"
case 1:
l.text = "Here's the second section"
default:
l.text = ""
}
return view
}
Voilà - tout le reste est une perte de temps.
Un autre problème Apple "pointilleux".
L'extension de commodité utilisée ci-dessus est:
extension UIView {
// incredibly useful:
func bindEdgesToSuperview() {
guard let s = superview else {
preconditionFailure("`superview` nil in bindEdgesToSuperview")
}
translatesAutoresizingMaskIntoConstraints = false
leadingAnchor.constraint(equalTo: s.leadingAnchor).isActive = true
trailingAnchor.constraint(equalTo: s.trailingAnchor).isActive = true
topAnchor.constraint(equalTo: s.topAnchor).isActive = true
bottomAnchor.constraint(equalTo: s.bottomAnchor).isActive = true
}
}
tableView:titleForHeaderInSection:?