Sagen Sie mir könnte jemand den Weg führen UITableView
erweiterbare / reduzierbare Animationen in sections
der UITableView
wie unten?
oder
ios
iphone
uitableview
object
vinnitu
quelle
quelle
Antworten:
Sie müssen Ihre eigene benutzerdefinierte Kopfzeile erstellen und diese als erste Zeile jedes Abschnitts einfügen. Das Unterklassen der
UITableView
oder der Header, die bereits vorhanden sind, wird schmerzhaft sein. Aufgrund der Art und Weise, wie sie jetzt funktionieren, bin ich mir nicht sicher, ob Sie leicht Aktionen aus ihnen herausholen können. Sie könnten eine Zelle zu sehen wie ein Header, und Setup die EinrichtungtableView:didSelectRowAtIndexPath
den Abschnitt manuell erweitern oder reduzieren es in ist.Ich würde ein Array von Booleschen Werten speichern, die dem "verbrauchten" Wert jedes Ihrer Abschnitte entsprechen. Dann können Sie den
tableView:didSelectRowAtIndexPath
Wert in jeder Ihrer benutzerdefinierten Kopfzeilen umschalten und dann diesen bestimmten Abschnitt neu laden.Setzen Sie dann
numberOfRowsInSection
den überprüfenmybooleans
Wert und 1 zurück , wenn der Abschnitt nicht erweitert wird, oder 1+ die Anzahl der Elemente in dem Abschnitt , wenn es erweitert wird.Außerdem müssen Sie aktualisieren
cellForRowAtIndexPath
, um eine benutzerdefinierte Kopfzelle für die erste Zeile in einem beliebigen Abschnitt zurückzugeben.quelle
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
ist der bessere Weg, um Ihren "eigenen benutzerdefinierten Header" bereitzustellen, da genau das dafür vorgesehen ist.Einige Beispielcodes zum Animieren einer Erweiterungs- / Reduzierungsaktion mithilfe einer Abschnittsüberschrift für die Tabellenansicht werden von Apple hier bereitgestellt: Animationen und Gesten für die Tabellenansicht
Der Schlüssel zu diesem Ansatz besteht darin,
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
eine benutzerdefinierte UIView zu implementieren und zurückzugeben, die eine Schaltfläche enthält (normalerweise dieselbe Größe wie die Header-Ansicht selbst). Indem Sie UIView in Unterklassen unterteilen und diese für die Header-Ansicht verwenden (wie in diesem Beispiel), können Sie problemlos zusätzliche Daten wie die Abschnittsnummer speichern.quelle
dequeueReusableHeaderFooterViewWithIdentifier
) - klicken Sie auf diesen Pfeil und scrollen Sie zurück zum ersten Spiel und versuchen Sie es zu schließen -> NSInternalInconsistencyException (iOS 8.4 / iPhone 5s)Ich habe eine schöne Lösung erhalten, die von Apples Table View-Animationen und -Gesten inspiriert ist . Ich habe unnötige Teile aus Apples Beispiel gelöscht und in schnell übersetzt.
Ich weiß, dass die Antwort ziemlich lang ist, aber der gesamte Code ist notwendig. Glücklicherweise können Sie den größten Teil des Codes einfach kopieren und einfügen und müssen nur ein wenig an Schritt 1 und 3 ändern
1. erstellen
SectionHeaderView.swift
undSectionHeaderView.xib
Die
SectionHeaderView.xib
(die Ansicht mit grauem Hintergrund) sollte in einer Tabellenansicht ungefähr so aussehen (Sie können sie natürlich an Ihre Bedürfnisse anpassen):Hinweis:
a) Die
toggleOpen
Aktion sollte mit verknüpft seindisclosureButton
b) die
disclosureButton
undtoggleOpen
Aktion sind nicht notwendig. Sie können diese beiden Dinge löschen, wenn Sie die Schaltfläche nicht benötigen.2. erstellen
SectionInfo.swift
3.in Ihrer Tabellenansicht
quelle
Um den zusammenklappbaren Tabellenabschnitt in iOS zu implementieren, besteht die Magie darin, die Anzahl der Zeilen für jeden Abschnitt zu steuern oder die Zeilenhöhe für jeden Abschnitt zu verwalten.
Außerdem müssen wir den Abschnittskopf anpassen, damit wir das Tap-Ereignis aus dem Kopfbereich abhören können (unabhängig davon, ob es sich um eine Schaltfläche oder den gesamten Kopf handelt).
Wie gehe ich mit dem Header um? Es ist sehr einfach, wir erweitern die UITableViewCell-Klasse und erstellen eine benutzerdefinierte Header-Zelle wie folgt:
Verwenden Sie dann viewForHeaderInSection, um die Header-Zelle anzuschließen:
Denken Sie daran, dass wir die contentView zurückgeben müssen, da diese Funktion die Rückgabe einer UIView erwartet.
Lassen Sie uns nun den zusammenklappbaren Teil behandeln. Hier ist die Umschaltfunktion, mit der die zusammenklappbare Stütze jedes Abschnitts umgeschaltet wird:
hängt davon ab, wie Sie die Abschnittsdaten verwalten. In diesem Fall habe ich die Abschnittsdaten ungefähr so:
Schließlich müssen wir basierend auf der zusammenklappbaren Stütze jedes Abschnitts die Anzahl der Zeilen dieses Abschnitts steuern:
Ich habe eine voll funktionsfähige Demo auf meinem Github: https://github.com/jeantimex/ios-swift-collapsible-table-section
Wenn Sie die reduzierbaren Abschnitte in einer gruppierten Tabelle implementieren möchten, habe ich hier eine weitere Demo mit Quellcode: https://github.com/jeantimex/ios-swift-collapsible-table-section-in-grouped-section
Hoffentlich hilft das.
quelle
Ich habe eine bessere Lösung, dass Sie einen UIButton in die Abschnittsüberschrift einfügen und die Größe dieser Schaltfläche gleich der Abschnittsgröße festlegen, diese jedoch durch eine klare Hintergrundfarbe ausblenden. Danach können Sie leicht überprüfen, auf welchen Abschnitt zum Erweitern oder Reduzieren geklickt wird
quelle
tableView:numberOfRowsInSection:
bleibt unberührt und Sie können sie weiterhin für das verwenden, was sie wirklich bedeutet. Gleiches gilt fürtableView:cellForRowAtIndexPath:
.UITableViewHeaderFooterView
und fügt einesection
Eigenschaft hinzu und definiert a,SectionHeaderViewDelegate
die den Rückruf zum Öffnen / Schließen des Abschnitts bereitstellt. ( developer.apple.com/library/ios/samplecode/TableViewUpdates/… )Am Ende habe ich nur eine Header-Ansicht erstellt, die eine Schaltfläche enthielt (ich habe Son Nguyens Lösung oben nachträglich gesehen , aber hier ist mein Code. Es sieht nach viel aus, ist aber ziemlich einfach):
Deklarieren Sie ein paar Bools für Ihre Abschnitte
...Code
Jetzt in Ihrer Tabellenansicht Methoden delegieren ...
und schließlich die Funktion, die aufgerufen wird, wenn Sie eine der Abschnittsüberschriften-Schaltflächen berühren:
quelle
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
in der Collapse / Uncollapse-Methode verwenden, sollte es gut animiert werden.Dies ist der beste Weg, um erweiterbare Tabellenansichtszellen zu erstellen
.h Datei
.m Datei
Delegierungsmethoden für Tabellenansichten
quelle
Basierend auf der "Button in Header" -Lösung ist hier eine saubere und minimalistische Implementierung:
Hier ist der Code:
quelle
Ich habe einen anderen relativ einfachen Weg gefunden, um dieses Problem zu lösen. Mit dieser Methode müssen wir unsere Zelle nicht ändern, was fast immer mit dem Datenarray-Index zusammenhängt, was möglicherweise zu Problemen in unserem Ansichts-Controller führen kann.
Zunächst fügen wir unserer Controller-Klasse die folgenden Eigenschaften hinzu:
collapsedSections
speichert reduzierte Abschnittsnummern.sectionViews
speichert unsere benutzerdefinierte Schnittansicht.Synthetisiere es:
Initialisieren Sie es:
Danach müssen wir unsere UITableView verbinden, damit innerhalb unserer View Controller-Klasse darauf zugegriffen werden kann:
Verbinden Sie es von XIB, um den Controller
ctrl + drag
wie gewohnt anzuzeigen .Anschließend erstellen wir eine Ansicht als benutzerdefinierten Abschnittskopf für unsere Tabellenansicht, indem wir diesen UITableView-Delegaten implementieren:
Als Nächstes implementieren wir eine Methode zum Speichern unseres zuvor erstellten benutzerdefinierten Abschnittskopfs in der Klasseneigenschaft:
Fügen Sie
UIGestureRecognizerDelegate
unserer View Controller .h-Datei hinzu:Dann erstellen wir eine Methode
attachTapGestureToView:
Die obige Methode fügt der zuvor erstellten Schnittansicht eine Tippgestenerkennung hinzu. Als nächstes sollten wir den
onTap:
Selektor implementierenDie obige Methode wird aufgerufen, wenn der Benutzer auf einen unserer Abschnitte in der Tabellenansicht tippt. Diese Methode sucht die korrekte Abschnittsnummer basierend auf unserem zuvor erstellten
sectionViews
Array.Außerdem implementieren wir eine Methode, um herauszufinden, zu welchem Abschnitt der Header-Ansicht gehört.
Als nächstes müssen wir die Methode implementieren
toggleCollapseSection:
Diese Methode fügt die Abschnittsnummer in unser zuvor erstelltes
collapsedSections
Array ein / entfernt sie . Wenn eine Abschnittsnummer in dieses Array eingefügt wird, bedeutet dies, dass der Abschnitt reduziert und erweitert werden sollte, wenn dies nicht der Fall ist.Als nächstes werden wir umsetzen
removeCollapsedSection:
,addCollapsedSection:section
undisCollapsedSection:section
Diese drei Methoden sind nur hilfreich, um uns den Zugriff auf das
collapsedSections
Array zu erleichtern .Implementieren Sie abschließend diesen Delegaten für Tabellenansichten, damit unsere benutzerdefinierten Abschnittsansichten gut aussehen.
Ich hoffe es hilft.
quelle
Ich habe ein NSDictionary als Datenquelle verwendet, das sieht nach viel Code aus, ist aber sehr einfach und funktioniert sehr gut! wie sieht das hier aus
Ich habe eine Aufzählung für die Abschnitte erstellt
Abschnitte Eigenschaft:
Eine Methode, die meine Abschnitte zurückgibt:
Und dann richte meine Daten ein:
Die nächsten Methoden helfen Ihnen zu wissen, wann ein Abschnitt geöffnet wird und wie Sie auf die Datenquelle der Tabellenansicht reagieren:
Antworten Sie auf den Abschnitt zur Datenquelle:
Werkzeuge:
Schalten Sie die Sichtbarkeit des Abschnitts ein
quelle
// vKj
quelle
// vKj
quelle
Erweitern Sie dies Antwort in Ziel C habe ich Folgendes für diejenigen geschrieben, die in Swift geschrieben haben
Die Idee ist, Abschnitte innerhalb der Tabelle zu verwenden und die Anzahl der Zeilen im Abschnitt auf 1 (reduziert) und 3 (erweitert) zu setzen, wenn auf die erste Zeile in diesem Abschnitt getippt wird
Die Tabelle entscheidet anhand eines Arrays von Booleschen Werten, wie viele Zeilen gezeichnet werden sollen
Sie müssen zwei Zeilen im Storyboard erstellen und ihnen die Wiederverwendungskennungen "CollapsingRow" und "GroupHeading" geben.
quelle
Einige Beispielcodes zum Animieren einer Erweiterungs- / Reduzierungsaktion mithilfe einer Abschnittsüberschrift in der Tabellenansicht werden von Apple unter Animationen und Gesten in der Tabellenansicht bereitgestellt .
Der Schlüssel zu diesem Ansatz liegt in der Implementierung
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
und geben Sie eine benutzerdefinierte UIView zurück, die eine Schaltfläche enthält (normalerweise dieselbe Größe wie die Header-Ansicht selbst). Indem Sie UIView in Unterklassen unterteilen und diese für die Header-Ansicht verwenden (wie in diesem Beispiel), können Sie problemlos zusätzliche Daten wie die Abschnittsnummer speichern.
quelle
Ich habe dasselbe mit mehreren Abschnitten gemacht.
quelle
Der Vollständigkeit halber füge ich diese Lösung hinzu und zeige, wie man mit Abschnittsüberschriften arbeitet.
Link zum Kern: https://gist.github.com/pawelkijowskizimperium/fe1e8511a7932a0d40486a2669316d2c
quelle
Verwenden Sie zur Unterstützung der @ jean.timex-Lösung den folgenden Code, wenn Sie jederzeit einen Abschnitt öffnen möchten. Erstellen Sie eine Variable wie: var expandSection = -1;
quelle