Wie erzwinge man das Ändern der Größe einer Zelle (nachdem eine Höhenbeschränkung deaktiviert wurde)?

9

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:

%Vor%

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%     
jonypz 22.02.2016, 21:25
quelle

4 Antworten

1

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

    
AncAinu 09.03.2016 11:21
quelle
0

Vergessen Sie, den Indexpfad von self.arrayExtendedTitlesAtIndexPaths zu entfernen?

%Vor%     
Amit Tandel 04.03.2016 08:03
quelle
0

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.

    
Kuba 04.03.2016 13:20
quelle
-1

Rufen Sie [cell layoutSubviews]; auf, sobald Ihre Änderungen abgeschlossen sind.

    
Ge0rges 09.03.2016 10:16
quelle