2013-10-20 12 views
11

Zusammenfassung: Im Bearbeitungsmodus, ich Löschen von Zeilen in einer Tabellenansicht eine benutzerdefinierte Editiersteuerabschnitt, anstatt der Standard-roten Minuszeichen und Bestätigungstaste löschen. Markieren Sie eine Zeile oder mehrere Zeilen und tippen Sie anschließend in der Symbolleiste auf die Schaltfläche Löschen. Es ähnelt dem Verhalten in der Mail-App. Siehe den Screenshot unten.Unregelmäßige Animationen aus UITableView der DeleteRowsAtIndexPaths: withRowAnimation:

enter image description here

Problem: Die Animationen durch Aufrufe deleteRowsAtIndexPaths:withRowAnimation: sind produziert unregelmäßig. Zum Beispiel, hier ist was passiert, wenn ich die untere Reihe Animation verwenden (dh UITableViewRowAnimationBottom) die tickte Zeile (Subject # 7) im Screenshot zu löschen:

  1. Thema # 8 gleitet unter und hinter Thema # 7
  2. Thema # 8 hinter Thema # 7
  3. Thema # 8 ersetzt Thema # 7 jarringly

Dies geschieht sowohl auf dem Simulator und auf einem Gerät kurz versteckt. Der automatische Animationstyp (d. H. UITableViewRowAnimationAutomatic) erzeugt das gleiche unregelmäßige Verhalten, wenn der Betreff Nr. 7 oben gelöscht wird.

Der obere Animationstyp funktioniert wie erwartet im Simulator, erzeugt jedoch inkonsistente, störende Animationen auf einem Gerät.

Die Fade-Animation ist die einzige Animation, die im Simulator und auf einem Gerät wie erwartet funktioniert.

Einzelheiten:

Ich bin iOS 7 und mit Storyboard, reines Autolayout und Core Data-Targeting.

Hier ist die Aktion-Methode, wo ich die Zeilen löschen:

- (void)deleteButtonTapped:(UIBarButton *)sender 
{ 
    // update table view's data 
    [self.listOfItems removeObjectsAtIndexes:self.indexSetOfTickedRows]; 

    // create index paths for ticked rows 
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 

    [self.indexSetOfTickedRows enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { 
     [indexPaths addObject:[NSIndexPath indexPathForRow:idx inSection:0]]; 
    }]; 

    [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationBottom]; 

    // update Core Data and UI... 
} 

Was habe ich versucht:

Die Tabellenzelle Unterklasse überschreibt layoutSubviews. Die unregelmäßigen Animationen bleiben jedoch erhalten, auch wenn ich layoutSubviews auskommentiere.

Ich habe auch das benutzerdefinierte tickbare Bearbeitungssteuerelement aus den Tabellenzellen entfernt und dann das Löschen einer bestimmten Zeile in der Aktionsmethode fest codiert. Die unregelmäßigen Animationen blieben bestehen.

Wie von anderen vorgeschlagen, habe ich versucht, deleteRowsAtIndexPaths:withRowAnimation: zwischen den Anrufen beginUpdates und endUpdates anzurufen. Dies behebt das Problem nicht.

Irgendwelche Vorschläge, was als nächstes zu tun ist, oder die besten Vermutungen, warum ich diese unregelmäßigen Animationen sehe?

Update (iOS 7.1):

Ausgabe nach iOS 7.1 Targeting bleibt. Bleibt weiterhin auf Fade-Animation angewiesen.

+1

Ich habe ähnliche Probleme, ich bekomme seltsame Animationen, wo die Trennlinie in eine Richtung und der Zellinhalt eine andere bewegt. Wieder verwende ich reines Auto-Layout und iOS7. Scheint mir Buggy. – Camsoft

+0

Ich habe diese Art von Verhalten gesehen, wenn das Threading nicht richtig durchgeführt wird. Das wäre der erste Ort, an dem ich mich umsehen würde. –

+0

Benötigen Sie keine Anrufe zum Starten und Beenden von Updates? – Remover

Antwort

0

Versuchen Hinzufügen [tableView beginUpdates]; und [tableView endUpdates];

+0

Das Problem wird nicht gelöst. Ich habe festgestellt, dass es ein Fehler ist. Fürs Erste verwende ich die Fade-Animation, die sich wie erwartet verhält. – bilobatum

0

Vielleicht die Alpha auf der Zellwerkseinstellung wie hier vorgeschlagen. Nicht sicher, obwohl. problems with animation when deleting the last row of a TableView in ios7

+0

Was meinst du genau? Ich habe in dem Beitrag, auf den du dich bezogen hast, keine Erwähnung von Alpha gesehen. – bilobatum

+0

Entschuldigung. Ich wollte mich auf den aktualisierten Link beziehen. Es hat für mich ein bisschen funktioniert, dass die Zelle, die gelöscht werden soll, versteckt wird. Dies verbesserte die Animation für mich, denn sonst sah es etwas seltsam aus, da ich Zellen mit unterschiedlichen Höhen hatte. Aber anscheinend hat das Einstellen des Alpha in iOS6 nicht gut funktioniert. Also habe ich die "versteckte" Eigenschaft auf "JA" gesetzt. –

1

Try [self.listOfItems removeObjectsAtIndexes:self.indexSetOfTickedRows]; am Ende der Funktion statt am Anfang aufrufen.

Verwandte Themen