99 votes

Je ne veux pas d'animation dans le bloc de début des mises à jour, fin des mises à jour pour la UITableView.

Je possède un UITableView qui utilise une cellule de tableau personnalisée et chaque cellule a un UIWebView.

Comme UIWebView prend beaucoup de temps à se charger, je veux éviter de les recharger à tout prix. Dans certaines situations, j'ai toutes les cellules chargées, mais leurs hauteurs sont mal réglées. Par conséquent, j'ai besoin de "retravailler" la table sans déclencher la fonction "cellForRow".

  1. Je ne peux absolument pas utiliser reloadData... car cela rechargera les cellules à nouveau.
  2. J'ai essayé tableView.setNeedDisplay, setNeedsLayout etc, aucun d'entre eux n'est capable de réarranger les cellules de la table
  3. La seule façon dont cela a fonctionné, c'est d'appeler le bloc beginupdates/endupdates, ce bloc est capable de retravailler ma table sans déclencher cellForRow! MAIS, je ne voulais pas l'animation! Ce bloc produit un effet d'animation mais je ne le souhaite pas...

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

223voto

Evgeny Shurakov Points 3392
[UIView setAnimationsEnabled:NON];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:OUI];

84voto

Dmitriy Points 1738

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

Obj-C

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

Swift

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

5voto

Neil Japhtha Points 445

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

// Malheureusement, ce n'est pas aussi simple que d'appeler :
//      UIView.setAnimationsEnabled(false)
//      self.tableView.beginUpdates()
//      self.tableView.endUpdates()
//      UIView.setAnimationsEnabled(true)

// Nous devons désactiver les animations.
UIView.setAnimationsEnabled(false)
CATransaction.begin()

// Et nous devons également définir le bloc de finalisation,
CATransaction.setCompletionBlock { () -> Void in
    // de l'animation.
    UIView.setAnimationsEnabled(true)
}

// Appeler ce dont nous avons besoin.
self.tableView.beginUpdates()
self.tableView.endUpdates()

// Valider l'animation.
CATransaction.commit()

5voto

hstdt Points 998

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)//l'animation true peut être plus performante

1voto

Jorge Arimany Points 11

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];

Essayez-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X