Essaie de retarder CABasicAnimation la position et l'opacité de la couche de 3 secondes mais
Je suis en train d'essayer de retarder l'animation de l'opacité du calque et de la positionner en 3 secondes à l'aide d'setBeginTime. J'ai appelé la couche boxLayer. L'animation se déroule bien, mais pendant les 3 premières secondes (la couche n'est pas censé montrer encore) la couche est affichée à la position finale et de l'opacité. Il ne devrait pas. Animation de groupe ne permet pas de résoudre le problème. Quelqu'un pourrait-il aider? Voir le code ci-dessous:
//Create an animation that will change the opacity of a layer
CABasicAnimation *fader = [CABasicAnimation animationWithKeyPath:@"opacity"];
//It will last 1 second and will be delayed by 3 seconds
[fader setDuration:1.0];
[fader setBeginTime:CACurrentMediaTime()+3.0];
//The layer's opacity will start at 0.0 (completely transparent)
[fader setFromValue:[NSNumber numberWithFloat:startOpacity]];
//And the layer will end at 1.0 (completely opaque)
[fader setToValue:[NSNumber numberWithFloat:endOpacity]];
//Add it to the layer
[boxLayer addAnimation:fader forKey:@"BigFade"];
//Maintain opacity to 1.0 JUST TO MAKE SURE IT DOES NOT GO BACK TO ORIGINAL OPACITY
[boxLayer setOpacity:endOpacity];
//Create an animation that will change the position of a layer
CABasicAnimation *mover = [CABasicAnimation animationWithKeyPath:@"position"];
//It will last 1 second and will be delayed by 3 seconds
[mover setDuration:1.0];
[mover setBeginTime:CACurrentMediaTime()+3.0];
//Setting starting position
[mover setFromValue:[NSValue valueWithCGPoint:CGPointMake(startX, startY)]];
//Setting ending position
[mover setToValue:[NSValue valueWithCGPoint:CGPointMake(endX, endY)]];
//Add it to the layer
[boxLayer addAnimation:mover forKey:@"BigMove"];
//Maintain the end position at 400.0 450.0 OTHERWISE IT IS GOING BACK TO ORIGINAL POSITION
[boxLayer setPosition:CGPointMake(endX, endY)];
comment le fait de faire une méthode de type [auto performSelector:@selector(methodname) withObject:néant afterDelay:3.0 f]; ou à l'aide de sleep();
Mon problème n'est pas le retard de l'animation, mais plutôt le fait que la couche est affichée avant le retard de l'animation commence.
Mon problème n'est pas le retard de l'animation, mais plutôt le fait que la couche est affichée avant le retard de l'animation commence.
OriginalL'auteur Armand | 2013-01-30
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes réglage de la
boxLayer
propriétés deposition
et deopacity
à leurs valeurs. Vous avez besoin de:Définir la
boxLayer
propriétés à leurs valeurs de départ, et non leurs valeurs de fin (c'est pourquoi il commence à la fin de la position/l'opacité ... en général si l'animation démarre immédiatement, ce n'est pas un problème, mais parce que vous êtes à reporter le début, en utilisant les positions de fin est problématique);Pour vos deux animations, vous devez changer
removedOnCompletion
àNO
etfillMode
àkCAFillModeForwards
(c'est la bonne façon de l'empêcher de revenir à la position d'origine dès la fin).Ainsi:
Personnellement, je pense que vous êtes en train de faire beaucoup de travail pour quelque chose qui se fait beaucoup plus facilement avec bloc d'animation sur la vue (pour les besoins de cette démonstration, je suis en supposant que votre
boxLayer
est unCALayer
pour un contrôle appelébox
). Vous n'avez pas besoin de Quartz 2D, soit, si vous faites de cette façon:Yep. Exactement comme vous l'avez dit Rob. Il est "commence visible pendant 3 secondes, puis disparaît et s'estompe lentement en arrière et s'anime pendant la seconde suivante". J'ai créé la couche avant le bloc que j'ai posté. J'ai pensé qu'il aurait été trop long à poster tout. C'est comme si je peut retarder le calque d'animation, tout en ayant l'affiche pour la première secondes ou je peut retarder l'affichage de la couche, bien que pas d'animation produit. Drôle. Je suis en utilisant des méthodes telles que setBeginTime et de la Durée. Pas de mise en page automatique ou animateWithDuration. Une idée?
Alors que je pense que c'est beaucoup plus facile à utiliser de bloc de base de l'animation des points de vue, j'ai mis à jour ma réponse avec le
CABasicAnimation
réponse, aussi, si vous avez votre coeur sur l'animation de la couches.Rob je suis ouvert à d'utiliser le bloc d'animation, même si je ne l'ai jamais fait avant... je vais essayer d'utiliser votre exemple et vous le fait savoir.
Merci beaucoup, Rob!!! Elle fonctionne. J'apprécie également votre mention de bloc de base de l'animation. La raison pour laquelle je suis coincé sur le calque est parce que je suis en utilisant un CATextLayer. Il a de texte. Les modifications de contenu d'une page à l'autre. En Plus j'ai besoin de la retourner sur le robinet. N'hésitez pas à me faire savoir si il y a un moyen plus simple de faire tout cela... on Pouvait bloquer l'animation peut traiter avec le texte intégré précédemment retiré de la base de données, le retournement de mouvement? Merci déjà 🙂
OriginalL'auteur Rob
Pour l'utilisation de
beginTime
vous devez prendre les mesures nécessaires à la configuration de votre animation de l'objet et de définirfillMode
àkCAFillModeBackwards
commeCe qui est dit dans la documentation d'Apple:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2
Aussi, à partir de Rob question:
C'est une sorte de déclaration controversée, parce que:
De https://www.objc.io/issues/12-animations/animations-explained/
OriginalL'auteur surfrider
Cet article qui explique bien pourquoi vous ne devriez pas utiliser removedOnCompletion avec fillMode https://www.objc.io/issues/12-animations/animations-explained/
Dans mon cas, je suis de l'animation de la couche d'un point de vue que les fonctions de navigation, mais de retarder un rebond de l'animation qui est à l'intérieur de ce point de vue ; j'ai BESOIN de DEUX DE CES POSTES mis à JOUR SUR LA COUCHE, car il peut être rejeté, puis affiche à nouveau. À l'aide de removedOnCompletion ne sera pas de mise à jour de la couche en valeur une fois l'animation terminée
La façon dont je le fais, c'est de mettre à jour la couche dans un CATransaction achèvement bloc
OriginalL'auteur dsieczko