Ich möchte keine Animation in den Start-Updates, Ende-Updates-Block für uitableview?


87

Ich habe eine UITableView, die eine benutzerdefinierte Tabellenzelle verwendet, und jede Zelle hat eine UIWebView.

Da das Laden von UIWebView einige Zeit in Anspruch nahm, möchte ich vermeiden, sie um jeden Preis neu zu laden. In einigen Situationen habe ich alle Zellen geladen, aber ihre Höhen sind durcheinander. Daher muss ich die Tabelle "weiterleiten", ohne die Funktion "cellForRow" auszulösen.

  1. Ich kann reloadData definitiv nicht verwenden ... da dadurch die Zellen erneut geladen werden.
  2. Ich habe tableView.setNeedDisplay, setNeedsLayout usw. ausprobiert. Keiner von ihnen kann die Tabellenzellen neu anordnen
  3. Der einzige Weg, wie es funktioniert hat, ist das Aufrufen des Blocks beginupdates / endupdates. Dieser Block kann meine Tabelle weiterleiten, ohne cellForRow auszulösen! ABER ich wollte die Animation nicht! Dieser Block erzeugt einen Animationseffekt, aber ich will ihn nicht ...

Wie kann ich mein Problem lösen?

Antworten:


213
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];

1
Das ist toll! Ich finde, es hat einige der interessantesten Anwendungen. Ich habe festgestellt, dass die Methode zum erneuten Laden von Abschnitten auch dann animiert wird, wenn Sie sie übergeben UITableViewRowAnimationNone, aber damit kann die Animation leicht umgangen werden!
Flying_Banana

64

Eine weitere Möglichkeit, dies mit Blöcken zu tun

Obj-C

[UIView performWithoutAnimation:^{
   [self.tableView beginUpdates];
   [self.tableView endUpdates];
}];

Schnell

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}

4

Ich arbeite an meinem Projekt, aber keine übliche Lösung.

let loc = tableView.contentOffset
UIView.performWithoutAnimation {

    tableView.reloadData()

    tableView.layoutIfNeeded()
    tableView.beginUpdates()
    tableView.endUpdates()

    tableView.layer.removeAllAnimations()
}
tableView.setContentOffset(loc, animated: true)//animation true may perform better

3

Swifties Ich musste Folgendes tun, damit dies funktioniert:

// Sadly, this is not as simple as calling:
//      UIView.setAnimationsEnabled(false)
//      self.tableView.beginUpdates()
//      self.tableView.endUpdates()
//      UIView.setAnimationsEnabled(true)

// We need to disable the animations.
UIView.setAnimationsEnabled(false)
CATransaction.begin()

// And we also need to set the completion block,
CATransaction.setCompletionBlock { () -> Void in
    // of the animation.
    UIView.setAnimationsEnabled(true)
}

// Call the stuff we need to.
self.tableView.beginUpdates()
self.tableView.endUpdates()

// Commit the animation.
CATransaction.commit()

Half mir. Vielen Dank. Wichtig, um setAnimationsEnabled(true)in den Abschlussblock zu setzen .
Lasse Bunk

Die Fußzeile wird jedoch erst aktualisiert, wenn Sie durch die Tabellenansicht scrollen.
Mr. Bean

@ Mr.Bean was ist der ganze Fall? (dh hat Ihre Tabellenansicht immer eine Fußzeile, versuchen Sie eine einzufügen oder eine zu entfernen?)
Neil Japhtha

Haben Sie immer eine Fußzeile, müssen Sie nur die Fußzeile aktualisieren (dh es gibt 2 Ansichten in der Fußzeile, müssen die Ansichten je nach Zustand ein- / ausblenden.)
Mr. Bean

@ Mr.Bean Was enthält dein Update-Block? Die erweiterbarste Methode wäre hier das Neuladen des Abschnitts.
Neil Japhtha

1

Ich bevorzuge einen reibungslosen Übergang:

CGPoint offset = self.tableView.contentOffset;
[UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.tableView reloadData];
        self.tableView.contentOffset = offset;
    } completion:nil];

Versuche es.


0

Ich wollte die Zellenhöhe für Abschnitt 5 aktualisieren und der folgende Code funktionierte für mich:

UiView.setAnimationsEnabled(False)
self.productTableView.reloadSections(NSIndexSet(index: SectionType.ProductDescription.hashValue), withRowAnimation: UITableViewRowAnimation.None)
self.productTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 5), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
UIView.setAnimationsEnabled(true)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.