webentwicklung-frage-antwort-db.com.de

iOS 11 UITableView Zeilen löschen Animationsfehler

Video des Tableview-Animationsfehlers

Ich habe eine Tabellenansicht, die ihre Zellen erweitert/reduziert.

Ab iOS 11 verhält sich tableView beim Einfügen und Löschen von Zeilen merkwürdig. Die contentSize hat sich geändert, bevor der Animationsblock ausgeführt wird. Infolgedessen können Sie im Video einen fehlerhaften Bildlauf beim Zurücksetzen von Zellen sehen. Die Animation sieht einfach falsch aus.

Dieser Code hat unter iOS 10 einwandfrei funktioniert. Weiß jemand, was sich auf Apples Seite geändert hat? Ist das ein bekanntes Problem?

public func insertingRowsForAccordion(_ indexArray: [IndexPath], selectedRowIndex: Int) {
    beginUpdates()
    insertRows(at: indexArray, with: UITableViewRowAnimation.fade)
    endUpdates()

 // Scroll to selection after expanding children
    scrollToRow(at: IndexPath(row: selectedRowIndex, section: 0), at: UITableViewScrollPosition.top, animated: true)
}

public func removeRowsForAccordion(_ indexArray: [IndexPath]) {
    beginUpdates()
    deleteRows(at: indexArray, with: UITableViewRowAnimation.fade)
    endUpdates()
}
21
l.vasilev

Ich hatte unzählige Probleme mit iOS 11 UITableView. Wenn ich in meiner gesamten App zu jedem UITableView gehe und die folgenden Schritte durchführe, wurden alle meine Probleme behoben.

Setzen Sie estimatedRowHeight, estimatedSectionHeaderHeight und estimatedSectionFooterHeight auf 0.

Quelle: iOS 11 Floating TableView Header

31
jvdev7

Ich hatte ein ähnliches Problem mit der Animation zum Entfernen von Tabellenzeilen unter iOS 11, bei dem manchmal seltsamerweise durch die Tabellenzellen gescrollt wurde (iOS 10 funktionierte einwandfrei). Was geholfen hat, war die Implementierung dieser Delegate-Methode, die die Zeilenhöhe zurückgibt:

- (CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

Danach funktionieren sowohl iOS 10 als auch 11 einwandfrei.

6
Chuck Boris

In iOS 11.2 hatte ich nach dem Löschen einer Zeile mit den Standardzeilenaktionen eine fehlerhafte Animation. Ich konnte die Situation nur verbessern, indem ich die Zeilenlöschung und die Zeilenaktionsentlassung in eine CATransaction einbaute.

Ich lasse zuerst die Zeilenaktionen aus und warte, bis diese Animation abgeschlossen ist, bevor ich die Zeile aus der Tabellenansicht lösche.

Zumindest springt es nicht mehr um den Inhaltsoffset der Tabellenansichten herum, sondern ist eine langwierige zweistufige Animation. Ich bin immer noch auf der Suche nach einer besseren Lösung.

        CATransaction.begin()
        CATransaction.setCompletionBlock({
            self.tableView.beginUpdates()
            self.myViewModel?.items?.remove(at: indexPath.row)
            self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.top)
            self.tableView.endUpdates()
        })
        self.tableView.setEditing(false, animated: true)
        CATransaction.commit()
5
Edward Hellyer

Ich habe es mit diesem Code behoben:

self.tableView.beginUpdates()
// ...
self.tableView.endUpdates()
self.tableView.layer.removeAllAnimations()
3
Piotr Merski