2015-04-05 5 views
63

Neu in iOS 8, können Sie 100% dynamische Tabellenansicht Zellen erhalten, indem Sie einfach die geschätzte Zeilenhöhe festlegen und dann Ihre Elemente in der Zelle mit Auto Layout gestalten. Wenn der Inhalt in der Höhe zunimmt, wird die Zelle auch in der Höhe zunehmen. Das ist sehr nützlich, und ich frage mich, ob das gleiche Talent für Abschnittsüberschriften in einer Tabellenansicht erreicht werden kann?Ist es möglich, mit Auto Layout eine dynamische Header-Höhe des Tabellenansichtsabschnitts zu erhalten?

Kann man zum Beispiel erstellen UIView in tableView:viewForHeaderInSection:, fügen Sie ein UILabel subview, automatische Layoutbeschränkungen für das Etikett gegen die Ansicht angeben, und haben den Blick Erhöhung der Höhe des Labels Inhalt passen, ohne tableView:heightForHeaderInSection: implementieren zu müssen ?

Die Dokumentation für viewForHeaderInSection besagt: "Diese Methode funktioniert nur ordnungsgemäß, wenn tableView: heightForHeaderInSection: ebenfalls implementiert ist." Ich habe nicht gehört, wenn sich für iOS 8 etwas geändert hat.

Wenn man das nicht kann, was ist der beste Weg, um dieses Verhalten nachzuahmen?

Antwort

164

Dies ist möglich. Es ist neu, direkt neben den dynamischen Zellenhöhen in iOS 8 implementiert.

Es ist sehr einfach. fügen Sie diese einfach in viewDidLoad:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension; 
self.tableView.estimatedSectionHeaderHeight = 25; 

Dann viewForHeaderInSection außer Kraft setzen und Auto-Layout verwenden, um Elemente aus Ihrer Sicht einschränken, wie fit gesehen. Das ist es! Keine Notwendigkeit, heightForHeaderInSection zu implementieren. Und eigentlich muss die sectionHeaderHeight auch nicht erwähnt werden, ich habe es nur für die Klarheit hinzugefügt.

Beachten Sie, dass Zellen und Kopf-/Fußzeilenansichten in iOS 11 standardmäßig geschätzte Höhen verwenden. Das einzige, was zu tun ist, ist eine geschätzte Höhe bereitzustellen, um das System besser zu informieren, was zu erwarten ist. Der Standardwert ist UITableViewAutomaticDimension, aber Sie sollten eine bessere Schätzung angeben, die die durchschnittliche Höhe ist, die sie wenn möglich sein werden.

+2

Das ist cool, wenn es funktioniert, aber die docs es nicht erwähnt, und auch nicht die WWDC Sitzung, wenn ich mich richtig erinnere. Die Dokumentation für 'UITableViewAutomaticDimension' lautet:" Wenn Sie diese Konstante in 'tableView: heightForHeaderInSection:' oder 'tableView: heightForFooterInSection:' zurückliefern, verwendet 'UITableView' eine Höhe, die zu dem von' tableView: titleForHeaderInSection: 'oder' tableView: titleForFooterInSection: '(wenn der Titel nicht' nil' ist). " –

+1

Ich kann bestätigen, es funktioniert wunderbar für Auto-Layout-Einschränkungen, die ich eingerichtet habe, einschließlich zusätzlicher Polsterung hinzugefügt - es ist nicht nur die Höhe des Textes.Tatsächlich habe ich 'tableView: titleForHeaderInSection:' nicht implementiert, das ist nicht nötig. – Joey

+0

Das ist aufregend. Toller Fund. –

19

Dies kann durch Setzen (oder Zurückgeben) der estimatedSectionHeaderHeight in Ihrer Tabellenansicht erreicht werden.

Wenn Ihr Abschnittskopf Ihre Zellen überlappen nach estimatedSectionHeaderHeight Einstellung, stellen Sie sicher, dass Sie eine estimatedRowHeight auch verwenden.

(Ich füge diese Antwort, weil der zweite Absatz eine Antwort auf eine Frage enthält, die nach dem Lesen durch alle Kommentare gefunden werden können, die einige verpassen könnte.)

+0

es funktioniert für mich. Danke – chipbk10

+0

Danke, nach der Einstellung 'geschätztRowHeight' das funktioniert wie Charme :) –

5

Ich versuchte

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension; 
self.tableView.estimatedSectionHeaderHeight = 25; 

aber es hat nicht korrekt Header mit Multiline-Label Größe. Hinzugefügt dies mein Problem zu lösen:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    // Recalculates height 
    tableView.beginUpdates() 
    tableView.endUpdates() 
} 
+0

dies funktioniert für mich – Neko

+0

definieren Sie die Datenquellfunktionen' 'tableView: geschätztHeightForHeaderInSection'' und' 'tableView: heightForHeaderInSection'' anstatt bei viewDidLoad zu definieren. –

Verwandte Themen