iOS8 selbstdimensionierende statische TableView-Zellen mit Interface Builder

9

Ich bin begeistert von der Aussicht, meine statischen TableViews direkt in Xcode erstellen zu können, indem ich Auto Layout zur Unterstützung des dynamischen Typs nutze, wie in WWDC2014 Was ist neu in Tabellen- und Auflistungsansichten .

Ich würde es vorziehen, streng Xcode / Interface Builder und Storyboards zu verwenden, um das automatische Layout zu behandeln. Wenn ich das tue, verändern die TableView-Zellen die Größe nicht und ich bin sicher, dass ich etwas Einfaches vermisse.

Um dies zu reproduzieren, benutze Xcode 7 beta 5, I:

  • Ein neues Einzelansichtsprojekt erstellt.
  • Setzen Sie den Storyboard-Einstiegspunkt auf einen neuen UITableViewController.
  • Machen Sie es zu einer statischen Tabellenansicht mit gruppiertem Stil.
  • Ein einzelnes Label wurde der ersten Zeile hinzugefügt. Einschränkungen oben, unten, links und rechts hinzugefügt.
  • Legen Sie die Beschriftungsschriftart auf "Körper" fest.
  • Hinzugefügt zu ViewDidLoad:

    self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44,0;

  • Habe es ausgeführt und den dynamischen Typ in den Einstellungen angepasst. Während sich die Schriftart ändert, bleibt die TableView-Höhe beim scheinbaren Standardwert von 44 hängen und schneidet die Beschriftung ab.

Hier ist ein GitHub-Repository , das das Ergebnis von oben ist.

Warum bewirkt das automatische Layout nicht, dass TableView erweitert wird, um den erforderlichen Platz für den neuen größeren Etikettentext zu füllen?

Ich habe großartige Beiträge zu diesem Thema gefunden, wie zum Beispiel das Folgende, mit der Absicht, Code zum Einrichten von Beschränkungen zu verwenden.

Zusätzlich, wenn ich eine explizite Höhenbeschränkung für die Beschriftung oder die Bildansicht festlege, erzeuge ich Folgendes. Das Problem scheint diese Einschränkung "UIView-Encapsulated-Layout-Height" zu sein, die ich nicht festgelegt habe. Ich vermute, dass es generiert wird, weil in meiner statischen Tabellenansicht in IB die Zeilenhöhe (standardmäßig) auf 44 gesetzt ist.

%Vor%

Aber sollte dies in ViewDidLoad nicht überschrieben werden?

%Vor%

Funktionieren selbstanpassende Tabellenansichtszellen einfach nicht mit statischen Tabellensichten?

Update 2

Ich habe dasselbe mit einem dynamischen Prototyp anstelle einer statischen Tabellenansicht erstellt, und alles funktioniert gut:

Es scheint tatsächlich statische gegen dynamische Prototyp-Tabellen zu sein. Statische Tabellenansichtszellen werden nicht ordnungsgemäß erweitert.

Ich habe in den WWDC-Videos keine Erwähnung von dynamic vs. static gesehen, daher sage ich an dieser Stelle einen Bug. Wird aktualisiert, wenn ich etwas Neues lerne.

Ich habe oben das GitHub-Repository aktualisiert, um ein Beispiel für die statischen (unterbrochenen) und dynamischen (funktionierenden) Tabellenansichten zu zeigen.

    
John Stewart 13.08.2015, 05:11
quelle

3 Antworten

3

Antwort:

Dies ist ein Fehler in Xcode7b5. Ich habe das gerade bestätigt, indem ich die identischen Schritte in Xcode 6.4 und Xcode 7b5 befolge.

  1. Erstellen Sie eine neue Einzelansicht-Anwendung
  2. Neue Datei. Cocoa-Klasse "MyStaticTableViewController", Unterklasse von UITableViewController.
  3. Ziehen Sie im Storyboard den neuen Tabellenansicht-Controller.
  4. Ändern Sie die Klasse in MyStaticTableViewController.
  5. Ziehen Sie den Storyboard-Einstiegspunkt auf den neuen VC.
  6. Löschen Sie den ursprünglichen VC.
  7. Ändern Sie die Klasse in MyStaticTableViewController für neue VC.
  8. Wählen Sie die Tabellenansicht. Ändern Sie den Inhalt in "Statische Zellen" und "Stil" in "Gruppiert".
  9. Ziehen Sie die neue Beschriftung in die erste Tabellensichtzelle. Schriftart in Körper ändern Setze die oberen, unteren, linken, rechten Constraints auf 0 und aktualisiere Frames.
  10. Fügen Sie in MyStaticTableViewController.m hinzu:
%Vor%
  1. Überprüfen Sie mit Dynamic Type, dass eine Vergrößerung der Tabelle dazu führt, dass die Tabellenzeile ebenfalls erweitert wird.

Das von Xcode 6.4 erstellte Projekt funktioniert wie erwartet - die Zellen der Tabellenansicht werden erweitert, um sie an das Label anzupassen.

Das von Xcode 7b5 erstellte Projekt schlägt fehl, wie in der ursprünglichen Frage beschrieben.

Wenn das Xcode6-Projekt mit Xcode7 geöffnet wird, funktioniert es interessanterweise auch. Es hängt damit zusammen, wie Xcode7 das Projekt oder das Storyboard erstellt.

Aktualisieren

Ich habe die .storyboard-Dateien miteinander verglichen, und in dem fehlerhaften Xcode7b5 unter dem TableView-Eintrag ist ein rect definiert:

%Vor%

Ich habe diese Zeile gelöscht und es sieht so aus, als ob die Tabellenansichtszelle sich jetzt korrekt selbst skaliert!

Update 2

Das Schlüsselproblem scheint ein "rect" -Eintrag zu sein, der unter jedem der "tableViewCell" -Einträge in der XML-Datei verbleibt. Whacking ist das, was dieses Problem behebt.

Update 3

Gespeicherter Radar:

"Das Engineering hat festgestellt, dass Ihr Fehlerbericht (22311571) ein Duplikat eines anderen Problems (17995201) ist und geschlossen wird."

    
John Stewart 17.08.2015, 17:35
quelle
1

Ich habe keine Zeit, mir den Code anzuschauen, aber ich bin mir fast sicher, dass das Problem das Etikett ist. Die Schriftgröße ändert sich, die Größe der Beschriftung jedoch nicht. Ich vermute, dass der Text nach dem Besetzen der ganzen Zeile nicht abgeschnitten wird, da es einen kleinen Rand hinterlässt.

Machen Sie einen schnellen Test: Setzen Sie einen farbigen Hintergrund auf das Textlabel. Meine Wette ist, dass Sie bemerken werden, dass es nicht wächst. Ist dies nicht der Fall, sehen Sie hier nach: Passen Sie die UIL-Höhe je nach Text an

    
Bartserk 13.08.2015 06:05
quelle
-1

Für statische Tabellenansichtszellen können Sie UITableViewAutomaticDimension innerhalb von ViewDidLoad nicht verwenden. Verwenden Sie stattdessen die Überschreibungsfunktion heightForRowAt. Ich habe nichts in meinem ViewDidLoad. Ich habe diese beiden Override-Funktionen oberhalb von ViewDidLoad hinzugefügt.

// Diese erste überschreibt die Höhe jeder Zeile, so dass sie automatisch die Größe ändert.

%Vor%

// Dies gibt eine Schätzung der Höhe der Zeilen vor der Größenänderung

%Vor%

Solange Sie Layoutbeschränkungen oben, unten, links und rechts haben, sollte sich alles in der Größe ändern.

    
Eric Duffett 18.07.2017 13:31
quelle