Je fais tourner un CALayer et j'essaie de l'arrêter à sa position finale une fois l'animation terminée.
Mais une fois l'animation terminée, elle revient à sa position initiale.
(les documents xcode indiquent explicitement que l'animation ne mettra pas à jour la valeur de la propriété.)
toutes les suggestions pour y parvenir.
ios
iphone
calayer
cabasicanimation
Nilesh Ukey
la source
la source
.presentation()
pour obtenir la valeur "finale, vue". Recherchez les bonnes réponses ci-dessous qui expliquent que c'est fait avec la couche de présentation.Réponses:
Voici la réponse, c'est une combinaison de ma réponse et de celle de Krishnan.
La valeur par défaut est
kCAFillModeRemoved
. (Quel est le comportement de réinitialisation que vous voyez.)la source
Le problème avec removeOnCompletion est que l'élément d'interface utilisateur ne permet pas l'interaction de l'utilisateur.
La technique consiste à définir la valeur FROM dans l'animation et la valeur TO sur l'objet. L'animation remplira automatiquement la valeur TO avant de commencer et, lorsqu'elle sera supprimée, laissera l'objet dans son état correct.
la source
alphaAnimation.beginTime = 1;
, lefillMode
n'est pas nécessaire pour autant que je sache ...?beginTime
n'est pas relatif, vous devriez utiliser par exemple:CACurrentMediaTime()+1;
fillMode
, voir plus dans Empêcher les couches de revenir aux valeurs d'origine lors de l'utilisation de CAAnimations explicitesDéfinissez la propriété suivante:
la source
mettez-le simplement dans votre code
la source
Vous pouvez simplement définir la clé de
CABasicAnimation
surposition
lorsque vous l'ajoutez au calque. En faisant cela, il remplacera l'animation implicite effectuée sur la position de la passe actuelle dans la boucle d'exécution.Vous pouvez avoir plus d'informations sur 2011 Apple WWDC Video Session 421 - Core Animation Essentials (milieu de la vidéo)
la source
someLayer.position = endPosition;
. Et merci pour la référence à la WWDC!Un CALayer a une couche de modèle et une couche de présentation. Lors d'une animation, la couche de présentation est mise à jour indépendamment du modèle. Une fois l'animation terminée, le calque de présentation est mis à jour avec la valeur du modèle. Si vous voulez éviter un saut discordant après la fin de l'animation, la clé est de garder les deux couches synchronisées.
Si vous connaissez la valeur finale, vous pouvez simplement définir le modèle directement.
Mais si vous avez une animation dont vous ne connaissez pas la position finale (par exemple un fondu lent que l'utilisateur peut mettre en pause puis inverser), vous pouvez interroger directement la couche de présentation pour trouver la valeur actuelle, puis mettre à jour le modèle.
Extraire la valeur du calque de présentation est également particulièrement utile pour la mise à l'échelle ou la rotation des chemins d'accès. (par exemple
transform.scale
,transform.rotation
)la source
Sans utiliser le
removedOnCompletion
Vous pouvez essayer cette technique:
la source
Mon problème était donc que j'essayais de faire pivoter un objet sur un mouvement de panoramique et que j'avais donc plusieurs animations identiques à chaque mouvement. J'avais les deux
fillMode = kCAFillModeForwards
etisRemovedOnCompletion = false
cela n'a pas aidé. Dans mon cas, je devais m'assurer que la clé d'animation est différente à chaque fois que j'ajoute une nouvelle animation :la source
Simplement régler
fillMode
etremovedOnCompletion
n'a pas fonctionné pour moi. J'ai résolu le problème en définissant toutes les propriétés ci-dessous sur l'objet CABasicAnimation:Ce code se transforme
myView
à 85% de sa taille (3ème dimension inchangée).la source
L'animation principale conserve deux hiérarchies de couches: la couche de modèle et la couche de présentation . Lorsque l'animation est en cours, le calque du modèle est en fait intact et conserve sa valeur initiale. Par défaut, l'animation est supprimée une fois qu'elle est terminée. Ensuite, la couche de présentation revient à la valeur de la couche de modèle.
Définir simplement
removedOnCompletion
surNO
signifie que l'animation ne sera pas supprimée et gaspille de la mémoire. De plus, la couche modèle et la couche présentation ne seront plus synchrones, ce qui peut entraîner des bogues potentiels.Il serait donc préférable de mettre à jour la propriété directement sur la couche de modèle à la valeur finale.
S'il y a une animation implicite causée par la première ligne du code ci-dessus, essayez de la désactiver:
la source
Cela marche:
L'animation principale montre un «calque de présentation» au-dessus de votre calque normal pendant l'animation. Définissez donc l'opacité (ou autre) sur ce que vous voulez voir lorsque l'animation se termine et que le calque de présentation disparaît. Faites-le sur la ligne avant d'ajouter l'animation pour éviter un scintillement une fois celle-ci terminée.
Si vous souhaitez avoir un retard, procédez comme suit:
Enfin, si vous utilisez 'removedOnCompletion = false', CAAnimations perdra jusqu'à ce que la couche soit finalement éliminée - évitez.
la source
La réponse de @Leslie Godwin n'est pas vraiment bonne, "self.view.layer.opacity = 1;" est fait immédiatement (cela prend environ une seconde), veuillez fixer alphaAnimation.duration à 10.0, si vous avez des doutes. Vous devez supprimer cette ligne.
Ainsi, lorsque vous fixez fillMode à kCAFillModeForwards et removeOnCompletion à NO, vous laissez l'animation rester dans la couche. Si vous corrigez le délégué d'animation et essayez quelque chose comme:
... le calque se rétablit immédiatement au moment où vous exécutez cette ligne. C'est ce que nous voulions éviter.
Vous devez corriger la propriété du calque avant d'en supprimer l'animation. Essaye ça:
la source
Il semble que l'indicateur removeOnCompletion défini sur false et fillMode sur kCAFillModeForwards ne fonctionne pas non plus pour moi.
Après avoir appliqué une nouvelle animation sur un calque, un objet animé se réinitialise à son état initial, puis s'anime à partir de cet état. Ce qui doit être fait en plus est de définir la propriété souhaitée de la couche de modèle en fonction de la propriété de sa couche de présentation avant de définir une nouvelle animation comme ceci:
la source
La solution la plus simple consiste à utiliser des animations implicites. Cela gérera tous ces problèmes pour vous:
Si vous souhaitez personnaliser par exemple la durée, vous pouvez utiliser
NSAnimationContext
:Remarque: ceci n'est testé que sur macOS.
Au départ, je n'ai vu aucune animation en faisant cela. Le problème est que le calque d'un calque basé sur la vue ne s'anime pas implicitement. Pour résoudre ce problème, assurez-vous d'ajouter un calque vous-même (avant de définir la vue sur calque).
Un exemple de comment procéder serait:
L'utilisation
self.wantsLayer
n'a fait aucune différence dans mes tests, mais cela pourrait avoir des effets secondaires que je ne connais pas.la source
Voici un échantillon du terrain de jeu:
false
surisRemovedOnCompletion
- laissez Core Animation nettoyer une fois l'animation terminéela source