Neu in iOS 8 können Sie 100% dynamische Tabellensichtzellen erhalten, indem Sie einfach die geschätzte Zeilenhöhe einstellen und dann die Elemente in der Zelle mit dem automatischen Layout anordnen. Wenn der Inhalt an Höhe zunimmt, nimmt auch die Höhe der Zelle zu. Dies ist äußerst nützlich und frage mich, ob in Abschnittsüberschriften in Tabellenansicht die gleiche Leistung erzielt werden kann.
Kann man zum Beispiel eine UIView
in tableView:viewForHeaderInSection:
erstellen, eine UILabel
-Unteransicht hinzufügen, automatische Layouteinschränkungen für das Etikett für die Ansicht angeben und die Ansicht der Ansicht vergrößern, um den Inhalt des Etiketts anzupassen, ohne tableView:heightForHeaderInSection:
implementieren zu müssen?
Die Dokumentation für viewForHeaderInSection
lautet: "Diese Methode funktioniert nur korrekt, wenn auch tableView: heightForHeaderInSection: implementiert ist." Ich habe nicht gehört, ob sich etwas für iOS 8 geändert hat.
Wenn man das nicht kann, wie kann man dieses Verhalten am besten nachahmen?
Das ist möglich. Es ist neu neben den dynamischen Zellenhöhen, die in iOS 8 implementiert wurden.
Es ist sehr einfach. Fügen Sie dies einfach in viewDidLoad
hinzu:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;
Überschreiben Sie dann viewForHeaderInSection
und verwenden Sie das automatische Layout, um die Elemente in Ihrer Ansicht nach Bedarf einzuschränken. Das ist es! heightForHeaderInSection
muss nicht implementiert werden. Und die sectionHeaderHeight
muss auch nicht angegeben werden, ich habe sie nur der Klarheit halber hinzugefügt.
In iOS 11 verwenden Zellen- und Kopf-/Fußzeilenansichten standardmäßig geschätzte Höhen. Sie müssen nur eine geschätzte Höhe angeben, um das System besser über die zu erwartenden Ergebnisse zu informieren. Der Standardwert ist UITableViewAutomaticDimension
, Sie sollten jedoch eine bessere Schätzung der Durchschnittshöhe vornehmen, wenn möglich.
Dies kann erreicht werden, indem Sie estimatedSectionHeaderHeight
in Ihrer Tabellenansicht setzen (oder zurückgeben).
Wenn sich die Kopfzeile Ihres Abschnitts nach der Einstellung von estimatedSectionHeaderHeight
mit Ihren Zellen überschneidet, stellen Sie sicher, dass Sie auch eine estimatedRowHeight
verwenden.
(Ich füge diese Antwort hinzu, weil der zweite Absatz eine Antwort auf ein Problem enthält, das gefunden werden kann, nachdem alle Kommentare gelesen wurden, die einige übersehen haben.)
Ich habe es versucht
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;
die Kopfzeile mit mehrzeiligem Etikett wurde jedoch nicht korrekt formatiert .. __ Zum Hinzufügen meines Problems wurde Folgendes hinzugefügt:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Recalculates height
tableView.beginUpdates()
tableView.endUpdates()
}
Swift 4 +
funktioniert (100% getestet)
Wenn Sie sowohl Abschnitte als auch Zeilen mit dynamischer Höhe basierend auf dem Inhalt benötigen, können Sie den folgenden Code verwenden:
Auf viewDidLoad () schreiben Sie diese Zeilen:
self.globalTableView.estimatedRowHeight = 20
self.globalTableView.rowHeight = UITableView.automaticDimension
self.globalTableView.sectionHeaderHeight = UITableView.automaticDimension
self.globalTableView.estimatedSectionHeaderHeight = 25;
Jetzt haben wir die Zeilen- und Abschnittshöhe mithilfe der UITableView Delegate-Methoden festgelegt:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableView.automaticDimension
}
In meinem Fall:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
.
im Storyboard eingestellt nicht funktionieren .
Überschreiben Sie heightForHeaderInSection
bearbeitet .
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return UITableViewAutomaticDimension }
testumgebung:
Ja, das funktioniert bei mir. Ich muss noch mehr ändern als unten:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let label = UILabel()
label.numberOfLines = 0
label.text = my own text
return label
}
Ich bin in der gleichen Ausgabe stecken geblieben, wo der Header bis auf Null Höhe gebracht wurde und wenn ich im Delegaten für heighForHeaderInSection
keine feste Höhe angegeben habe.
Versuchte viele Lösungen, die beinhaltet
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 73`
Aber nichts hat funktioniert. Meine Zelle verwendete auch richtige Autolayouts. Zeilen haben ihre Höhe dynamisch geändert, indem der folgende Code verwendet wurde, der Abschnittskopf jedoch nicht.
self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableViewAutomaticDimension`
Das Update ist extrem einfach und komisch, aber ich musste die Delegat-Methoden anstelle von 1-Zeilen-Code für estimatedSectionHeaderHeight
und sectionHeaderHeight
implementieren, was für meinen Fall wie folgt lautet.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
return 73
}