Tweening / Interpolation entre deux CGPaths / UIBeziers

J'ai un CAShapeLayer qui contient un CGPath. En utilisant l'animation embeddede d'iOS, je peux facilement transformer ce path en un autre en utilisant une animation:

CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"]; morph.fromValue = (id)myLayer.path; mayLayer.path = [self getNewPath]; morph.toValue = (id)myLayer.path; morph.duration = 0.3; [myLayer addAnimation:morph forKey:nil]; 

Cela fonctionne parfaitement.

Cependant, je voudrais maintenant se transformer progressivement entre ces paths lors d'une opération de glisser. Pour ce faire, je dois être en mesure de récupérer le path interpolé à tout moment pendant la traînée. Existe-t-il un moyen de requestr à iOS pour cela?

Ceci est en fait beaucoup plus simple que vous le penseriez d'abord et utilise des animations avec une vitesse "non" (en pause). Maintenant, avec l'animation en pause ajoutée à la couche, vous pouvez modifier le décalage temporel pour passer à une heure spécifique dans l'animation.

Si vous ne prévoyez pas d'exécuter l'animation par elle-même (c'est-à-dire de la contrôler manuellement), je vous suggère de changer la durée de l'animation à 1. Cela signifie que vous changez le décalage de 0 à 1 100%. Si votre durée était de 0,3 (comme dans votre exemple), vous devez plutôt définir le décalage temporel sur une valeur comprise entre 0 et 0,3.

la mise en oeuvre

Comme je l'ai dit plus haut, il y a très peu de code impliqué dans cette petite astuce.

  1. (Facultatif) Définissez la durée sur 1,0
  2. Réglez la speed de la couche (oui, ils sont conforms à CAMediaTiming ) ou l'animation à 0.0
  3. Pendant le geste de timeOffset ou le slider (comme dans mon exemple), définissez le timeOffset du calque ou de l'animation (en fonction de ce que vous avez fait à l'étape 2).

C'est ainsi que j'ai configuré mon animation + couche de forme

 CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"]; morph.duration = 1.; // Step 1 morph.fromValue = (__bridge id)fromPath; morph.toValue = (__bridge id)toPath; [self.shapeLayer addAnimation:morph forKey:@"morph shape back and forth"]; self.shapeLayer.speed = 0.0; // Step 2 

Et l'action du slider:

 - (IBAction)sliderChanged:(UISlider *)sender { self.shapeLayer.timeOffset = sender.value; // Step 3 } 

Vous pouvez voir le résultat final ci-dessous. Codage heureux!

entrez la description de l'image ici