web-dev-qa-db-fra.com

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

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

Parce que UIWebView a mis du temps à se charger, je veux éviter de les recharger à tout prix . Dans certaines situations, toutes les cellules sont chargées, mais leur hauteur est foirée . Par conséquent, je dois "relayer" le 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éorganiser les cellules du tableau
  3. La seule façon dont cela a fonctionné 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 ne le veux pas ...

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

76
mkto
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
198
Evgeny Shurakov

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()   
}
48
Dmitriy

Swifties Je devais 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()
3
Neil Japhtha

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
2
hstdt

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.

1
Jorge Arimany

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)
0
Aadi007