Ich fand eine WIRKLICH EINFACHE Lösung dafür als Nebeneffekt zu einer, an der UITableView
ich arbeitete .....
Speichern Sie die Zellenhöhe in einer Variablen, die die ursprüngliche Höhe normalerweise über das tableView: heightForRowAtIndexPath:
anzeigt. Wenn Sie eine Höhenänderung animieren möchten, ändern Sie einfach den Wert der Variablen und rufen Sie diese ...
[tableView beginUpdates];
[tableView endUpdates];
Sie werden feststellen, dass es nicht vollständig neu geladen wird, aber es reicht aus, um UITableView
zu wissen, dass es die Zellen neu zeichnen muss, um den neuen Höhenwert für die Zelle zu ermitteln ... und wissen Sie was? Es animiert die Veränderung für Sie. Süss.
Ich habe eine detailliertere Erklärung und vollständige Codebeispiele in meinem Blog ... Animieren Sie die Änderung der UITableView-Zellenhöhe
You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.
developer.apple.com/library/ios/documentation/UIKit/Reference/…Ich mag die Antwort von Simon Lee. Ich habe diese Methode nicht ausprobiert, aber es sieht so aus, als würde sie die Größe aller Zellen in der Liste ändern. Ich hatte auf eine Veränderung nur der Zelle gehofft, die abgehört wird. Ich habe es irgendwie wie Simon gemacht, aber mit nur einem kleinen Unterschied. Dies ändert das Aussehen einer Zelle, wenn sie ausgewählt wird. Und es animiert. Nur ein anderer Weg, es zu tun.
Erstellen Sie ein int, um einen Wert für den aktuell ausgewählten Zellenindex zu speichern:
Dann:
Dann:
Ich bin sicher, dass Sie ähnliche Änderungen in tableView vornehmen können: cellForRowAtIndexPath: um den Zelltyp zu ändern oder sogar eine xib-Datei für die Zelle zu laden.
Auf diese Weise beginnt die aktuelle Auswahl bei 0. Sie müssten Anpassungen vornehmen, wenn die erste Zelle der Liste (bei Index 0) nicht standardmäßig ausgewählt aussehen soll.
quelle
Fügen Sie eine Eigenschaft hinzu, um die ausgewählte Zelle zu verfolgen
Stellen Sie einen Sentinel-Wert in (zum Beispiel) ein
viewDidLoad
, um sicherzustellen, dass derUITableView
Start in der 'normalen' Position erfolgtIn
heightForRowAtIndexPath
können Sie die gewünschte Höhe für die ausgewählte Zelle festlegenIn
didSelectRowAtIndexPath
speichern Sie die aktuelle Auswahl und speichern bei Bedarf eine dynamische HöheIn
didDeselectRowAtIndexPath
auf Normalform den Auswahlindex zurück zum Sentinel - Wert und animiert die Zelle zurückquelle
reloadData ist nicht gut, weil es keine Animation gibt ...
Folgendes versuche ich gerade:
Es funktioniert fast richtig. Fast. Ich vergrößere die Höhe der Zelle, und manchmal tritt in der Tabellenansicht ein kleiner "Schluckauf" auf, wenn die Zelle ersetzt wird, als ob eine Bildlaufposition in der Tabellenansicht erhalten bleibt, die neue Zelle (die erste Zelle) in der Tabelle) endet mit einem zu hohen Versatz, und die Bildlaufansicht springt zurück, um ihn neu zu positionieren.
quelle
Ich weiß nicht, was all das Zeug über das Aufrufen von beginUpdates / endUpdates nacheinander ist, Sie können es einfach verwenden
-[UITableView reloadRowsAtIndexPaths:withAnimation:]
. Hier ist ein Beispielprojekt .quelle
Ich beschloss mit
reloadRowsAtIndexPaths
.Ich speichere im
didSelectRowAtIndexPath
indexPath der ausgewählten Zelle und rufereloadRowsAtIndexPaths
am Ende auf (Sie können NSMutableArray für eine Liste der Elemente senden, die Sie neu laden möchten).Im
heightForRowAtIndexPath
Sie überprüfen, ob indexPath in der Liste der expandIndexPath-Zellen enthalten ist oder nicht, und die Sendehöhe festlegen.Sie können dieses grundlegende Beispiel überprüfen: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam Es ist eine einfache Lösung.
Ich füge eine Art Code hinzu, wenn ich dir helfe
quelle
Anstelle von
beginUpdates()
/endUpdates()
lautet der empfohlene Aufruf jetzt:Zu beginUpdates / endUpdates sagt Apple: "Verwenden Sie nach Möglichkeit anstelle dieser Methode die Methode performBatchUpdates (_: Completion :)."
Siehe: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates
quelle
Versuchen Sie dies zum Erweitern der indexweisen Zeile:
quelle
quelle
Nur eine Notiz für jemanden wie mich, der nach "Weitere Details" in einer benutzerdefinierten Zelle sucht.
Hat eine hervorragende Arbeit geleistet, aber vergessen Sie nicht, die Zellansicht zu "beschneiden". Wählen Sie im Interface Builder Ihre Zelle -> Inhaltsansicht -> Wählen Sie im Eigenschafteninspektor " Clip-Unteransicht ".
quelle
Hier ist eine kürzere Version von Simons Antwort für Swift 3. Ermöglicht auch das Umschalten der Zellenauswahl
quelle
Swift 4 und höher
Fügen Sie den folgenden Code in die didselect-Zeilendelegatmethode von tableview ein
quelle
Schnelle Version von Simon Lees Antwort.
Dann in didSelectRowAtIndexPath ()
quelle
Ja es ist möglich.
UITableView
hat eine Delegate-MethodedidSelectRowAtIndexPath
Aber in Ihrem Fall , wenn der Benutzer blättert und wählt eine andere Zelle dann müssen u die letzte ausgewählte Zelle haben , zu schrumpfen und die aktuell ausgewählte Zelle zu erweitern
reloadRowsAtIndexPaths:
AnrufeheightForRowAtIndexPath:
so handelte entsprechend.quelle
Hier ist mein Code für benutzerdefinierte
UITableView
Unterklassen, dieUITextView
in der Tabellenzelle erweitert werden, ohne neu geladen zu werden (und den Tastaturfokus zu verlieren):quelle
Ich habe die großartige Antwort von @ Joy verwendet und sie hat perfekt mit ios 8.4 und XCode 7.1.1 funktioniert.
Für den Fall, dass Sie Ihre Zelle umschaltbar machen möchten, habe ich die -tableViewDidSelect wie folgt geändert:
Ich hoffe, irgendetwas davon hat dir geholfen.
quelle
Überprüfen Sie diese Methode nach iOS 7 und höher.
Dies wurde in iOS 8 verbessert. Wir können es als Eigenschaft der Tabellenansicht selbst festlegen.
quelle
Schnelle Version von Simon Lees Antwort :
Beachten Sie, dass Sie die Höheneigenschaften VORHER ändern sollten
endUpdates()
.quelle
Eingänge -
tableView.beginUpdates () tableView.endUpdates () Diese Funktionen werden nicht aufgerufen
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Wenn Sie dies jedoch tun, tableView.reloadRows (unter: [selectedIndexPath! As IndexPath], mit: .none)
Es wird die Funktion func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} dieser Funktion aufrufen .
quelle
Ich habe dieses Problem gerade mit einem kleinen Hack gelöst:
Wenn ich die Zellenhöhe erweitern muss, setze ich
isInEdit = YES
die Methode und rufe[self onTimer]
sie auf. Sie animiert das Zellwachstum, bis es den Wert s_CellHeightEditing erreicht :-)quelle
Ruft den Indexpfad der ausgewählten Zeile ab. Laden Sie die Tabelle neu. Legen Sie in der heightForRowAtIndexPath-Methode von UITableViewDelegate die Höhe der ausgewählten Zeile auf eine andere Höhe fest und geben Sie für die anderen die normale Zeilenhöhe zurück
quelle
[table reloadData]
führt dazu, dass die Höhenänderung sofort erfolgt und nicht animiert wird.