101 votes

Durée de l'animation de ligne UITableView et rappel d'achèvement

Existe-t-il un moyen de spécifier la durée des animations de ligne UITableView ou d’obtenir un rappel lorsque l’animation est terminée?

Ce que je voudrais faire est de faire clignoter les indicateurs de défilement une fois l’animation terminée. Faire le flash avant ne fait rien. Pour l’instant, la solution de contournement que j’ai à faire est de retarder d’une demi-seconde (ce qui semble être la durée d’animation par défaut), c’est-à-dire:

 [self.tableView insertRowsAtIndexPaths:newRows
                      withRowAnimation:UITableViewRowAnimationFade];
[self.tableView performSelector:@selector(flashScrollIndicators)
                     withObject:nil
                     afterDelay:0.5];
 

209voto

karwag Points 1074

Je viens de découvrir cela. Voici comment le faire:

 [CATransaction begin];

[tableView beginUpdates];

//...

[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
}];

[tableView insertRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];


[tableView endUpdates];

[CATransaction commit];
 

39voto

Brent Points 501

En développant la réponse précise de karwag , notez que sur iOS 7, entourer la transaction CATransaction d’une animation UIView permet de contrôler la durée de l’animation de la table.

 [UIView beginAnimations:@"myAnimationId" context:nil];

[UIView setAnimationDuration:10.0]; // Set duration here

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    NSLog(@"Complete!");
}];

[myTable beginUpdates];
// my table changes
[myTable endUpdates];

[CATransaction commit];
[UIView commitAnimations];
 

La durée de l'animation UIView n'a aucun effet sur iOS 6. Peut-être que les animations de table iOS 7 sont implémentées différemment, au niveau UIView.

26voto

visnu Points 46

Pour raccourcir la bonne réponse de Brent , pour au moins iOS 7, vous pouvez envelopper tout cela dans un [UIView animateWithDuration: delay: options: animations: complétion:] call:

 [UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
  [self.tableView beginUpdates];
  [self.tableView endUpdates];
} completion:^(BOOL finished) {
  // completion code
}];
 

Cependant, je ne peux pas sembler remplacer la courbe d'animation par défaut par autre chose que EaseInOut.

-5voto

Ahmed Points 302

Remplacez tableView -insertRowsAtIndexPaths: et implémentez l'animation d'insertion / (ou la suppression avec sa propre méthode) personnalisée souhaitée. Je n'ai pas essayé moi-même si.

-9voto

Jordan Points 14134

Vous pouvez essayer d’envelopper le insertRowsAtIndexPath dans un

 - (void)beginUpdates
- (void)endUpdates
 

transaction, puis faites le flash après.

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