it-swarm.com.de

Ist es möglich, mit Auto Layout eine Höhe der dynamischen Tabellenseitenansicht zu erhalten?

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?

87
Jordan H

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.

228
Jordan H

Dies kann erreicht werden, indem Sie estimatedSectionHeaderHeight in Ihrer Tabellenansicht setzen (oder zurückgeben). 

Wenn sich die Kopfzeile Ihres Abschnitts nach der Einstellung von estimatedSectionHeaderHeightmit 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.) 

22
Clay Ellis

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()
}
6
iuriimoz

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

   }
2

In meinem Fall:

  1. programmgesteuert setzen nicht arbeiten .

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. im Storyboard eingestellt nicht funktionieren .

  2. Überschreiben Sie heightForHeaderInSection bearbeitet .

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

testumgebung:

  • Mac OS 10.13.4 
  • XCode-Version 9.4.1
  • Simulator iPhone 8 Plus
0
Codus

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
}
0
arg_vn

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
}
0
Ahsan Ebrahim