L'animation CALayer de shadowPath propriété

Je suis conscient qu'un CALayer de shadowPath n'est animable avec des animations, cependant je ne peux toujours pas obtenir que cela fonctionne. Je soupçonne que je ne suis pas en passant la toValue correctement ce que je comprends, ce doit être un id, mais la propriété a une CGPathRef. Le stockage de ce dans une UIBezierPath ne semble pas fonctionner. J'utilise le code suivant pour tester:

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = [UIBezierPath bezierPathWithRect:CGRectMake(-10.0, -10.0, 50.0, 50.0)];
[self.view.layer addAnimation:theAnimation forKey:@"animateShadowPath"];

(Je suis en utilisant les valeurs négatives de manière à assurer l'ombre s'étend au-delà d'un affichage qui se trouve sur le dessus de celui-ci... la couche masksToBounds propriété est définie à NO).

Comment est-animation de la shadowPath atteint?

Mise à JOUR

Problème près de résolu. Malheureusement, le principal problème était un peu imprudent d'erreur...

L'erreur que j'ai faite a été d'ajouter de l'animation à la racine de la couche de la vue-contrôleur, plutôt que la couche à laquelle j'avais consacré à l'ombre. Aussi, @pe8ter était correct en ce que l' toValue doit être un CGPathRef fonte à id (évidemment, quand j'avais essayé cela avant, je n'avais pas encore l'animation due à la mauvaise couche erreur). L'animation fonctionne avec le code suivant:

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:myRect].CGPath;
[controller.shadowLayer addAnimation:theAnimation forKey:@"shadowPath"];

J'apprécie c'était difficile à repérer à partir de l'exemple de code que j'ai fourni. J'espère qu'il peut encore être utile aux personnes dans une situation similaire.

Cependant, lorsque j'essaie d'ajouter la ligne

controller.shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:myRect].CGPath;

l'animation s'arrête de travailler, et l'ombre saute à la position finale instantanément. Docs disent d'ajouter de l'animation avec la même clé que la propriété a été modifié de façon à remplacer l'implicite d'animation créé lors de la configuration de la valeur de la propriété, cependant shadowPath ne peut pas générer implicite des animations... alors, comment puis-je obtenir la nouvelle propriété pour un séjour après l'animation?

Désolé cela n'a pas aidé. La seule alternative est, je pense, à l'aide de CALayerdéléguée à définir explicitement la propriété après animation. Voir le ce post.
Donc de très près! J'ai suivi cette grande idée, mais il ya un très faible flash d'origine shadowPath avant animationDidStop: intercepte l'animation et fixe le cadre. Tellement frustrant. Ce parce que j'ai à parcourir un petit tableau d'affichage des contrôleurs d'identifier le bon calque pour chaque animation, bien que je soupçonne le délégué de la méthode vient d'être tiré en une fraction de seconde trop tard, après la shadowPath a déjà été réglé à sa valeur d'origine.
Il est difficile de dire ce qui ne va pas avec votre code. J'ai raillé un petit programme de test et essayé les deux façons; ils ont travaillé comme prévu sans artefacts visuels.
Aussi, l'utilisation addAnimation:forKey: de donner un nom unique pour vos animations. Le paramètre clé ne doit pas être la même que celle que vous spécifiez dans animationWithKeyPath:. Voir cette. Désolé je ne pouvais pas aider plus.

OriginalL'auteur Stuart | 2011-05-07