Exemplo completo de 2019 para copiar e colar
Primeiro set "Agrupado" no storyboard: tem que acontecer no momento do init, você não pode configurá-lo mais tarde, por isso é mais fácil lembrar de fazê-lo no storyboard:
Próximo,
É necessário implementar heightForHeaderInSection devido a um erro da Apple.
func tableView(_ tableView: UITableView,
heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat(70.0)
}
Ainda existe um bug da Apple - há dez anos - em que ele simplesmente não mostra o primeiro cabeçalho (ou seja, índice 0) se você não tiver heightForHeaderInSection
chamada.
Então, tableView.sectionHeaderHeight = 70
simplesmente não funciona, está quebrado .
Definir um quadro não alcança nada:
Em viewForHeaderInSection
simplesmente criar um UIView ().
Não faz sentido / não consegue nada se você UIView (quadro ...) já que o iOS simplesmente define o tamanho da exibição, conforme determinado pela tabela.
Portanto, a primeira linha de viewForHeaderInSection
será simples let view = UIView()
e essa é a visão que você retorna.
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
}
É isso aí - qualquer outra coisa é uma perda de tempo.
Outra questão "exigente" da Apple.
A extensão de conveniência usada acima é:
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:
?