Ich versuche eine erweiterbare UITableViewCell
durch Tippen auf eine Schaltfläche zu setzen.
Ich verwende die Einschränkungen, um die dynamische UITextView
zu zwingen, der UITableViewCell
die neue Höhe zu geben. (mit Autolayout und UITableViewAutomaticDimension
)
Dies funktioniert wie erwartet ohne den Button: Die Höhe des UITableViewCell
hängt von der Höhe von UITextView
ab.
Wenn ich eine Beschränkung auf UITextView
habe, um die Größe der Zelle zu maximieren, wenn ich auf die Schaltfläche klicke (die Zelle ist kollabiert), möchte ich die Höhenbeschränkung auf UITextView
(das heißt die Zellenhöhe) und Aktualisieren Sie die Zelle entsprechend. Hier ist die extend-Methode:
Wenn ich auf die Schaltfläche tippe und dann zu einer ähnlichen Zelle blättere, ist sie bereits erweitert. Da fehlt mir hier etwas. Ich habe versucht, [cell updateConstraints]
nach dem Deaktivieren der Einschränkung zu tun, aber es funktioniert nicht.
AKTUALISIEREN
Zunächst wird die Schaltfläche aus irgendeinem Grund nicht angezeigt. Und ich bemerkte, dass (mit dem gleichen Code), wenn ich nach unten und dann nach oben scrolle, der Button erscheint und wenn ich versuche, ihn zu erweitern, funktioniert es.
AKTUALISIEREN
Dies ist mein UIViewController:
Beachten Sie, dass der Extend-Button nicht vorhanden ist, aber sobald ich nach unten / oben scrolle, wird er angezeigt und er verlängert die Zelle, sobald ich auf den Extend-Button klicke.
AKTUALISIEREN
Ich habe bemerkt, dass, wenn die textSize berechnet wird (um zu sehen, ob die Zelle erweiterbar ist oder nicht), der textView zuerst breiter als sein Endzustand ist. Und ich führe diese Prüfung auf dem cellForRowAtIndexPath durch:
%Vor%Also beim ersten Lauf (vor dem Scrollen) [self isTitleExtendable: title forTextView: cell.textViewTitle]; gibt den gewünschten Wert nicht zurück, da textView nicht über die richtige Breite verfügt, wenn die textSize berechnet wird.
Also ich glaube die folgenden Optionen haben: - erzwinge das Aktualisieren des textViewTitle, nachdem das Layout geändert wurde (wodurch der erweiterbare UI-Status korrekt berechnet wird) - Überprüfen Sie den erweiterbaren UI-Status erneut, sobald der textViewTitle die Breite ändert
AKTUALISIEREN
Bei der Methode prepareForReuse hat der textViewTitle noch einen breiteren Rahmen. Auf der layoutSubviews-Methode hat es tatsächlich einen kleinen Rahmen. Die Herausforderung hier ist, dass es öfter aufgerufen wird, und es mir falsche Fälle (Knopf wird angezeigt, wenn es nicht sollte)
Das habe ich mit experimentiert:
%Vor% Um so etwas zu tun, sollten Sie sich nicht auf Constraint verlassen, aber auf tableView(_:heightForRowAtIndexPath:)
müssen Sie nur die richtige Höhe angeben, abhängig vom Kontext.
Wenn Sie den Button drücken, wird eine Änderung ausgelöst, sodass tableView(_:heightForRowAtIndexPath:)
einen anderen Wert für Ihre Zelle zurückgibt, den Sie erweitern.
Und kurz nachdem du diesen Trigger ausgelöst hast, mach einfach:
%Vor% ohne etwas dazwischen, es wird die "natürliche Animation" von UITableView
auslösen und genau das tun, was Sie wollen
Vergessen Sie, den Indexpfad von self.arrayExtendedTitlesAtIndexPaths zu entfernen?
%Vor%Wenn die Schaltfläche nicht vorhanden ist und während des Scrollens wieder angezeigt wird, haben Sie ein Problem mit der Wiederverwendbarkeit.
Sie werden wahrscheinlich entscheiden, den Button in cellForRowAtIndexPath:
anzuzeigen oder zu verbergen. Wenn Sie eine Bedingung haben, versuchen Sie, diese Schaltfläche immer anzuzeigen, und wenn dies wie erwartet funktioniert, dann blenden Sie eine Schaltfläche in einer Zelle aus, wenn diese Einschränkung vorhanden ist oder nicht. Die richtige Methode ist prepareForReuse
in UITableViewCell
subclass.
Tags und Links uitableview ios autolayout nslayoutconstraint