Je ne veux pas d'animation dans les mises à jour de début, le bloc de mises à jour de fin pour uitableview?

89

J'ai un UITableView qui utilise une cellule de table personnalisée et chaque cellule a un UIWebView.

Parce que UIWebView a pris du temps à se charger, je veux éviter de les recharger à tout prix. Dans certaines situations, toutes les cellules sont chargées, mais leurs hauteurs sont faussées. Par conséquent, j'ai besoin de "relayer" la table sans déclencher la fonction "cellForRow".

  1. Je ne peux certainement pas utiliser reloadData ... car il rechargera à nouveau les cellules.
  2. J'ai essayé tableView.setNeedDisplay, setNeedsLayout etc., aucun d'entre eux n'est capable de réorganiser les cellules du tableau
  3. La seule façon de fonctionner est d'appeler le bloc beginupdates / endupdates, ce bloc est capable de relayer ma table sans déclencher cellForRow! MAIS, je ne voulais pas l'animation! Ce bloc produit un effet d'animation mais je n'en veux pas ...

Comment puis-je résoudre mon problème?

mkto
la source

Réponses:

216
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
Evgeny Shurakov
la source
1
C'est bien! Je trouve qu'il a des applications des plus intéressantes. J'ai trouvé que la méthode de rechargement des sections s'animera toujours même si vous passez UITableViewRowAnimationNone, mais avec cela, l'animation peut être facilement contournée!
Flying_Banana
65

Une autre façon de le faire en utilisant des blocs

Obj-C

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

Rapide

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}
Dmitriy
la source
4

travailler sur mon projet, mais pas une solution commune.

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
la source
3

Swifties, j'ai dû faire ce qui suit pour que cela fonctionne:

// 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
la source
M'a aidé. Merci. Important à mettre setAnimationsEnabled(true)à l'intérieur du bloc de complétion.
Lasse Bunk
Mais cela ne met pas à jour le pied de page tant que vous ne faites pas défiler la vue du tableau.
M. Bean
@ Mr.Bean quel est le cas complet? (c'est-à-dire que votre tableview a toujours un pied de page, essayez-vous d'en insérer un ou d'en supprimer un?)
Neil Japhtha
Toujours avoir un pied de page, juste besoin de mettre à jour le pied de page (c'est-à-dire qu'il y a 2 vues à l'intérieur du pied de page, besoin de masquer / afficher les vues en fonction de la condition.)
M. Bean
@ Mr.Bean que contient votre bloc de mise à jour? La méthode la plus extensible ici serait de recharger la section.
Neil Japhtha
1

Je préfère avoir une transition en douceur:

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

Essaie.

Jorge Arimany
la source
0

Je voulais mettre à jour la hauteur de cellule pour la section 5 et le code suivant a fonctionné pour moi:

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
la source