J'ai une boucle sans fin CABasicAnimation
d'une tuile d'image répétitive à mon avis :
a = [CABasicAnimation animationWithKeyPath:@"position"];
a.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear];
a.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
a.toValue = [NSValue valueWithCGPoint:CGPointMake(image.size.width, 0)];
a.repeatCount = HUGE_VALF;
a.duration = 15.0;
[a retain];
J'ai essayé de "mettre en pause et de reprendre" l'animation des couches comme décrit dans le document suivant Q&A technique QA1673 .
Lorsque l'application passe en arrière-plan, l'animation est supprimée de la couche. Pour compenser, j'écoute UIApplicationDidEnterBackgroundNotification
et appeler stopAnimation
et en réponse à UIApplicationWillEnterForegroundNotification
appelez startAnimation
.
- (void)startAnimation
{
if ([[self.layer animationKeys] count] == 0)
[self.layer addAnimation:a forKey:@"position"];
CFTimeInterval pausedTime = [self.layer timeOffset];
self.layer.speed = 1.0;
self.layer.timeOffset = 0.0;
self.layer.beginTime = 0.0;
CFTimeInterval timeSincePause =
[self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
self.layer.beginTime = timeSincePause;
}
- (void)stopAnimation
{
CFTimeInterval pausedTime =
[self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
self.layer.speed = 0.0;
self.layer.timeOffset = pausedTime;
}
Le problème est qu'elle recommence au début et qu'il y a un saut horrible de la dernière position, comme on peut le voir sur l'instantané de l'application que le système a pris lorsque l'application est entrée en arrière-plan, au début de la boucle d'animation.
Je n'arrive pas à trouver comment faire en sorte qu'elle commence à la dernière position, lorsque je réintroduis l'animation. Franchement, je ne comprends pas comment fonctionne ce code de QA1673 : dans resumeLayer
il définit deux fois le layer.beginTime, ce qui semble redondant. Mais lorsque j'ai supprimé le premier set-to-zero, l'animation n'a pas repris là où elle avait été mise en pause. Ceci a été testé avec une simple reconnaissance de geste de tapotement, qui a fait basculer l'animation - ceci n'est pas strictement lié à mes problèmes de restauration à partir de l'arrière-plan.
Quel état dois-je retenir avant que l'animation ne soit supprimée et comment puis-je restaurer l'animation à partir de cet état, lorsque je la réintroduis plus tard ?
1 votes
Vous avez eu de la chance avec ça ? J'ai des animations qui se mettent en pause et reprennent dans ma pause de jeu. Cependant, lorsque je sors de l'arrière-plan, toutes les animations interrompues semblent être terminées. Je sais que je peux le faire en capturant l'état de la couche de présentation. Mais c'est un vrai casse-tête. Il doit y avoir un moyen plus simple !
1 votes
Pas de chance. Je garde aussi le
[layer presentationLayer]
comme une solution de rechange dans ma poche arrière, si le besoin de réparer cela devient critique. Comme vous le dites, cela semble être un véritable PITA.1 votes
J'ai réussi à faire fonctionner l'Apple QA1673 et c'était génial pour mettre en pause et reprendre le jeu. Mais quel est l'intérêt si cela ne fonctionne pas pour l'arrière-plan ? Pour moi, l'intérêt du QA1673 était d'éviter d'avoir à le faire à la manière de PresentationLayer.