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?
CALayer
dé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
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'avez pas défini l'animation
fromValue
.Deuxièmement, vous avez raison:
toValue
accepte unCGPathRef
, sauf qu'il doit être jeté àid
. Faire quelque chose comme ceci:Vous devrez également définir la
shadowPath
propriété de la couche explicitement si vous souhaitez le changer pour rester après l'animation.fromValue
parce que, selon les docs il est facultatif (et je suis animer à partir de l'actuel chemin d'accès). Casting pourid
, tout en supprimant l'avertissement du compilateur, n'a toujours pas résolu mon problème. Il est vrai que le point sur la définition explicite de la shadowPath propriété de retenir la modification après l'animation, cependant je ne vois aucune animation en premier lieu, donc je suppose que le problème doit se situer ailleurs.Comment y arriver maintenant - était négligemment l'envoi de l'animation de la couche de mal. Ayant des problèmes avec l'conservant la nouvelle valeur pour la shadowPath après l'animation, mais - j'ai mis à jour ma question.
Le temps de manger un peu de tarte humble. Votre première suggestion de réglage de la
fromValue
a résolu mon problème. Je dois admettre, il ne sembler une étrange subtilité pour moi, mais en déclarant explicitement lafromValue
que le chemin d'accès actuel, pour quelque raison permet à l'animation de procéder correctement lorsque la propriété est définie. Je souhaite que les docs ont été plus clair à ce sujet. Merci à tous pour votre aide.OriginalL'auteur pe8ter
OriginalL'auteur T T Marshel Daniel