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".
- Je ne peux certainement pas utiliser reloadData ... car il rechargera à nouveau les cellules.
- J'ai essayé tableView.setNeedDisplay, setNeedsLayout etc., aucun d'entre eux n'est capable de réorganiser les cellules du tableau
- 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?
UITableViewRowAnimationNone
, mais avec cela, l'animation peut être facilement contournée!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() }
la source
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
la source
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()
la source
setAnimationsEnabled(true)
à l'intérieur du bloc de complétion.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.
la source
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)
la source