J'essaie d'exécuter un bloc d'achèvement une fois que CAAnimation est terminé. Cependant, il semble que le bloc d'animation soit appelé avant la fin de mon animation. L'animation se passe quand même correctement.
[CATransaction begin];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction setCompletionBlock:completionBlock];
[CATransaction commit];
DropAndBounceAnimation est un CAKeyFrameAnimation sur position.y, avec une durée fixe.
Je ne sais pas si c'est vraiment le correctif correct, mais en définissant le completion-block before en ajoutant l'animation pour la couche, le completion-block est appelé de manière cohérente au bon moment.
[CATransaction begin];
[CATransaction setCompletionBlock:completionBlock];
[self.view.layer addAnimation:self.dropAndBounceAnimation forKey:@"appearance"];
[CATransaction commit];
Vous devez définir le bloc d'animation avant d'ajouter l'animation.
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];
[CATransaction setCompletionBlock:^{
// ... whatever you want to do when the animation is complete
}];
[self.googleMapsView animateToCameraPosition:[GMSCameraPosition
cameraWithLatitude:LATITUDE
longitude:LONGITUDE
zoom:ZOOM]];
[CATransaction commit];
Cela doit déclencher le bloc d'achèvement après l'achèvement de cette animation sur la vue.
Voici Swift 3.0.1, Xcode 8 version:
CATransaction.begin()
CATransaction.setCompletionBlock({
print("Transaction completed")
})
print("Transaction started")
view.layer.add(dropAndBounceAnimation, forKey: "appearance")
CATransaction.commit()
Essayez de démarrer l'animation de manière asynchrone:
DispatchQueue.main.async {
self.startAnimation()
}
car cela peut interférer avec le dessin de vue si vous configurez les vues avant d'appeler l'animation