Ich versuche, die Zellenhöhe für eine der Zellen in meiner Tabellenansicht anzupassen. Ich passe die Größe über die Einstellung "Zeilenhöhe" im "Größeninspektor" der betreffenden Zelle an. Wenn ich die App auf meinem iPhone ausführe, wird für die Zelle die Standardgröße aus der "Zeilengröße" in der Tabellenansicht festgelegt.
Wenn ich die "Zeilengröße" der Tabellenansicht ändere, ändert sich die Größe aller Zellen. Ich möchte das nicht tun, da ich eine benutzerdefinierte Größe nur für eine Zelle möchte. Ich habe viele Posts gesehen, die eine programmatische Lösung für das Problem haben, aber ich würde es vorziehen, dies über das Storyboard zu tun, wenn dies möglich ist.
quelle
UITableView
Inhalt vonDynamic Prototypes
auf zu ändern.Static Cells
Ich habe das getan, und mein gesamtes Projekt ist in die Luft gesprengt worden. Ich bin fast selbst umgebracht worden.Wenn Sie UITableViewController verwenden, implementieren Sie diese Methode:
In der Funktion einer Zeile können Sie Höhe wählen. Beispielsweise,
In diesem Beispiel beträgt die Höhe der ersten Zeile 100 Pixel und die anderen 60 Pixel.
Ich hoffe dieser kann dir helfen.
quelle
Bei dynamischen Zellen überschreibt die
rowHeight
EinstellungUITableView
immer die einzelnen ZellenrowHeight
.Dieses Verhalten ist, IMO, ein Fehler. Jedes Mal, wenn Sie Ihre Benutzeroberfläche an zwei Stellen verwalten müssen, ist sie fehleranfällig. Wenn Sie beispielsweise Ihre Zellengröße im Storyboard ändern, müssen Sie daran denken, sie auch im Storyboard zu ändern
heightForRowAtIndexPath:
. Bis Apple den Fehler behebt, besteht die derzeit beste Problemumgehung darin, ihn zu überschreibenheightForRowAtIndexPath:
. Verwenden Sie jedoch die tatsächlichen Prototypzellen aus dem Storyboard, um die Höhe zu bestimmen, anstatt magische Zahlen zu verwenden . Hier ist ein Beispiel:Auf diese Weise wird sichergestellt, dass Änderungen an den Zellenhöhen Ihres Prototyps zur Laufzeit automatisch erfasst werden und Sie Ihre Benutzeroberfläche nur an einem Ort verwalten müssen: dem Storyboard.
quelle
Ich habe den Code so erstellt, dass die verschiedenen Antworten / Kommentare darauf hinweisen, dass dies für Storyboards funktioniert, die Prototypzellen verwenden.
Dieser Code:
Vielen Dank an Answerbot, Brennan und Lensovet.
quelle
Es gibt tatsächlich zwei Stellen, an denen Sie die Zeilenhöhe ändern müssen: erstens die Zelle (das haben Sie bereits geändert) und jetzt die Tabellenansicht auswählen und den Größeninspektor überprüfen
quelle
Ich denke, es ist ein Fehler.
Versuchen Sie, die Höhe nicht mit dem Utility-Inspektor anzupassen, sondern mit der Maus direkt auf das Storyboard zu ziehen.
Ich habe dieses Problem mit dieser Methode gelöst.
quelle
Wenn Sie Swift verwenden, verwenden Sie dies wie folgt. Verwenden Sie kein Storyboard, um die Zeilenhöhe auszuwählen. Stellen Sie die Tabellenzeilenhöhe programmgesteuert wie folgt ein:
quelle
cell.sizeToFit(); self.tableView.rowHeight = cell.frame.height
Sie können die Höhe von UITableviewCell (in UITableviewController - statische Zellen) mithilfe der folgenden Zeilen aus dem Storyboard abrufen.
quelle
Öffnen Sie das Storyboard in der XML-Ansicht und versuchen Sie, das zu bearbeiten
rowHeight
Attribut des gewünschten Elements .Es hat bei mir funktioniert, als ich versucht habe, die benutzerdefinierte Zeilenhöhe für meine prototypisierte Zeile festzulegen. Es funktioniert nicht über den Inspektor, sondern über XML.
quelle
Sie können einen Prototyp
cells
mit einem Benutzerdefinierten verwendenheight
und danncellForRowAtIndexPath:
dessenframe.height
.: Aufrufen und zurückgeben .quelle
Wenn Sie eine statische Zeilenhöhe festlegen möchten, können Sie Folgendes tun:
quelle
Ich habe kürzlich damit gerungen. Mein Problem waren die oben genannten Lösungen mit dem
heightForRowAtIndexPath:
Methode für iOS 7.1 im Simulator funktionieren würden, aber dann die Ergebnisse durch einfaches Umschalten auf iOS 8.1 völlig durcheinander gebracht haben.Ich begann mehr über Zellen mit Selbstgröße zu lesen (eingeführt in iOS 8, lesen Sie hier ). Es war offensichtlich, dass die Verwendung von
UITableViewAutomaticDimension
in iOS 8 helfen würde. Ich habe versucht, diese Technik zu verwenden, und die Verwendung vonheightForRowAtIndexPath:
und voila gelöscht. In iOS 8 funktionierte sie jetzt perfekt. Aber iOS 7 war es nicht. Was sollte ich tun? Ich brauchteheightForRowAtIndexPath:
für iOS 7 und nicht für iOS 8.Hier ist meine Lösung (der Kürze halber gekürzt), die sich aus der Antwort @JosephH oben ergibt:
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (@ "8.0") stammt tatsächlich aus einer Reihe von Makrodefinitionen, die ich verwende und die ich irgendwo gefunden habe (sehr hilfreich). Sie sind definiert als:
quelle
Das gleiche Problem trat auf, wenn mit Swift 4 an XCode 9 gearbeitet wurde .
Wenn Sie AutoLayout für die UI-Elemente in der Zelle hinzufügen, funktioniert die benutzerdefinierte Zellenzeilenhöhe wie angegeben.
quelle
Bei dynamischen Zellen überschreibt die in UITableView festgelegte Zeilenhöhe immer die Zeilenhöhe der einzelnen Zellen. Berechnen Sie einfach die dynamische Höhe, wenn sich der Inhalt in der Zeile befindet.
quelle
Die einzige wirkliche Lösung, die ich finden konnte, ist diese
Dies funktioniert und erlaubt es, keinen schrecklichen Schalter zu haben / wenn die Logik bereits im StoryBoard dupliziert wird. Ich bin mir nicht sicher über die Leistung, aber ich denke, wenn ich ankomme
cellForRow:
der bereits angekommenen Zelle ankomme, ist es genauso schnell. Natürlich gibt es hier wahrscheinlich Kollateralschäden, aber es sieht so aus, als würde es hier für mich gut funktionieren.Ich habe dies auch hier gepostet: https://devforums.apple.com/message/772464
EDIT: Ortwin Gentz hat mich daran erinnert, dass
heightForRowAtIndexPath:
für alle Zellen der TableView aufgerufen wird, nicht nur für die sichtbaren. Klingt logisch, da iOS die Gesamthöhe kennen muss, um die richtigen Bildlaufleisten anzeigen zu können. Dies bedeutet, dass es in kleinen TableViews (z. B. 20 Zellen) wahrscheinlich in Ordnung ist, in einer 1000-Zellen-TableView jedoch vergessen wird.Auch der vorherige Trick mit XML: Wie der erste Kommentar für mich. Der richtige Wert war bereits da.
quelle
Als Kommentar hinzugefügt, aber als Antwort für die Sichtbarkeit gepostet:
Es scheint auch ein Problem zu sein , wenn Sie zunächst Setup eine Tabellenansicht als „statische Zellen“ und es dann ändern , um „dynamische Prototypen.“ Ich hatte ein Problem, bei dem sogar die Delegatenmethode für
heightForRowAtIndexPath
ignoriert wurde. Ich habe es zuerst gelöst, indem ich das Storyboard-XML direkt bearbeitet und dann die Storyboard-Szene von Grund auf neu erstellt habe, wobei ich von Anfang an dynamische Prototypen verwendet habe.quelle
Da ich über Interface Builder keine Lösung für dieses Problem gefunden habe, habe ich beschlossen, eine programmatische Lösung für das Problem in Swift mit zwei dynamischen Zellen zu veröffentlichen , obwohl in der ersten Frage über Interface Builder nach einer Lösung gefragt wurde. Unabhängig davon denke ich, dass es für die Stack Overflow-Community hilfreich sein könnte:
quelle
Sie können auch zu Ihrer Dokumentübersicht gehen und die Tabellenansicht auswählen, in der Ihre Prototypzelle verschachtelt ist. Ändern Sie dann im Größeninspektor die Zeilenhöhe Ihrer Tabellenansicht auf den gewünschten Wert und deaktivieren Sie das Kontrollkästchen Automatisch.
quelle