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?

mkto
quelle

Antworten:

213
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
Evgeny Shurakov
quelle
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()   
}
Dmitriy
quelle
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
hstdt
quelle
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()
Neil Japhtha
quelle
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.

Jorge Arimany
quelle
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)
Aadi007
quelle