Automatische Größenanpassung von UITableViewCell in iOS 8

8

Ich habe eine UITableViewCell-Unterklasse, die ein mehrzeiliges Etikett enthält, und ich möchte, dass sich die Zelle dynamisch auf der Grundlage des Inhalts dieses Etiketts anpasst. Mir ist bewusst, dass iOS 8 Auto-Sizing-Zellen basierend auf AutoLayout-Einschränkungen eingeführt hat, und ich habe bereits einige Beispiele dafür auf SO gefunden, aber ich habe immer noch Probleme, dieses Verhalten richtig zu implementieren.

Hier ist meine updateConstraints-Implementierung:

%Vor%

Im Tabellenansicht-Controller setze ich die Zeilenhöhe auf UITableViewAutomaticDimension (und setze auch eine geschätzte Zeilenhöhe). Zur Laufzeit bekomme ich eine Reihe von Auto-Layout-Fehlern und alle Tabellenansichtszellen erscheinen fast vollständig überlappend.

Die automatischen Layoutkonflikte liegen zwischen den folgenden Einschränkungen:

  • V:|-(10)-[_nameLabel]
  • V:[_nameLabel(20)]
  • V:[_nameLabel]-(10)-[_tweetLabel]
  • V:[_tweetLabel]-(10)-|
  • V:[cell(44)]

Ich vermute, die letzte Einschränkung, "UIView-Encapsulated-Layout-Height", die eine Höhe von 44 erzwingt, ist die Ursache des Problems, aber ich bin mir nicht sicher, woher das kommt, also hoffentlich kann jemand abwerfen etwas Licht auf das Problem.

    
futurevilla216 01.08.2014, 20:12
quelle

3 Antworten

9

Um automatische Zeilenhöhen für Tabellenansichtszellen zu implementieren, müssen Sie Folgendes tun:

  1. Implementieren Sie automatische Layouteinschränkungen in der contentView der Zelle, die es der Ansicht ermöglichen, ihre bevorzugte Höhe auszudrücken. Stellen Sie sicher, dass UILabel s für den Zeilenumbruch über mehrere Zeilen gesetzt ist.

    Stellen Sie sicher, dass Sie eine axiale Kette von Abhängigkeiten in beiden Dimensionen definiert haben, dh Abhängigkeiten, die den gesamten Weg von einer Kante der Ansicht zur anderen verbinden. Der einfachste Weg, um sicherzustellen, dass diese Einschränkungen korrekt sind, besteht darin, Ihren benutzerdefinierten Inhalt als einfaches altes UIView zu implementieren (was einfach zu testen ist) und dann Einschränkungen zu verwenden, sodass UITableViewCell.contentView diese Ansicht umarmt. (Ich verwende diesen Kern , um den Aufbau der "View-Wrapping-Zelle" zu automatisieren.)

  2. Setzen Sie tableView.rowHeight = UITableViewAutomaticDimension

  3. Setzen Sie tableView.estimatedRowHeight = 400 oder einen anderen, einigermaßen großzügigen Wert, um einige UIKit-Fehler zu umgehen, wenn die Schätzung zu niedrig ist.

Ich habe eine Menge Zeit damit verbracht, mit dieser Funktion zu arbeiten. Dieses Github-Repo zeigt sieben vollständige Beispiele für selbstanpassende Tabellenansichtszellen mit einem einzelnen Label für den umgebenden Text - programmatisch, nib-basiert, Storyboard-basiert, etc ..

Machen Sie sich nicht zu viele Sorgen, wenn Sie beim ersten Laden der Tabellenansicht Warnungen über unerfüllbare Constraints sehen, die "UIView-Encapsulated-Layout-Height" oder ähnliches enthalten. Dies ist ein Artefakt des ersten Prozesses von UITableView zum Erstellen einer Zelle, wobei bestimmt wird, wie groß die Größe sein sollte und basierend auf Auto Layout Constraints, und% UITableViewCell eng umschließt contentView . Das Repo, das ich oben erwähnt habe, hat eine ausführlichere Diskussion und einen Code zum Erkunden dieser etwas unangenehmen Ecke der API.

Sie sollten sich nur über Warnhinweise zur Continuity-Verletzung Gedanken machen, wenn sie bestehen bleiben, auch nachdem die Zelle geladen wurde und ein wenig gescrollt wurde oder wenn Sie anfänglich falsche Layouts sehen. In diesem Fall sollte der erste Schritt immer wieder darin bestehen, sicherzustellen, dass Ihre Constraints korrekt sind, indem Sie sie entwickeln und möglichst isoliert testen, in einer einfachen UIView .

    
algal 18.08.2015 06:57
quelle
4

Ich bin gerade auf dieses Problem gestoßen.

Von zahlreichen anderen Stackoverflow-Posts empfehlen sie:

%Vor%

Das hat zuerst nicht funktioniert. Ich habe festgestellt, dass ich auch tun muss :

%Vor%

Die init-Methode meiner benutzerdefinierten Zelle sieht folgendermaßen aus:

%Vor%

Ich habe den Code in meine "initViews" -Methode eingefügt:

%Vor%

Das Problem ist weg und meine Zelle sieht auch korrekt aus.

Funktioniert das für Sie?

    
Zhang 19.03.2015 05:59
quelle
2

Sind Sie sicher, dass -translatesAutoresizingMaskIntoConstraints in der Zelle auf NO gesetzt ist? Wenn dies nicht der Fall ist, generiert das System Einschränkungen basierend auf der Autoresizing-Maske. Dies war der vorherige Weg, das Layout auf iOS durchzuführen, und sollte deaktiviert werden, wenn Auto Layout verwendet wird.

    
wander 01.08.2014 20:19
quelle