Animation de vues [Résolu]

décembre 2012 modifié dans API AppKit #1
Salut à  tous.



Je développe en ce moment une application pour compter les points au tarot. Cela se présente comme suit : une fenêtre unique avec barre d'outils qui affiche une vue entièrement occupée par une NSTableView qui compile les scores de chaque tour (avec le total partiel). Puis, quand le tour est fini, on appuie sur un bouton de la barre d'outils qui décale cette vue vers le bas pour libérer un bandeau qui sert à  afficher une autre vue avec des contrôles pour compter les points du tour (contrat, oudlers,primes ... )Puis, quand le décompte est fini, cette vue disparaà®t et la vue principale reprend sa place. Je suis arrivé à  faire les deux vues, à  afficher la vue principale ,soit en haut de la fenêtre, soit en bas. J'arrive également à  afficher et masquer la vue accessoire. Tout marche bien, donc, je voudrai aller plus loin. En effet, la vue passe directement de position haute en position basse et je voudrai faire une animation, comme un paneau qui se baisse. Ou dois-je chercher dans la volumineuse documentation qui peut exister sur ce sujet ?

Réponses

  • NasatyaNasatya Membre
    décembre 2012 modifié #2
    Modérateur: Merci de regarder dans quelle section est postée le message. Ici, c'est pour OS X, et la réponse ne convient pas.





    Salut pour les animations ce sont des fonction lié au view tu as une doc du programming guide :



    http://developer.app...atingviews.html



    Sinon la doc des UIView



    http://developer.app...iew/uiview.html



    Ce sont des méthodes relativement simple en gros ça donne ça


    <br />
    - (IBAction)moveView:(id)sender<br />
    {<br />
    	// Fade out the view right away<br />
    	[UIView animateWithDuration:(float duree animation)<br />
    		delay:(float temps avant le lancement)<br />
    		options: UIViewAnimationOptionCurveEaseIn<br />
    		animations:^{<br />
    			 myView.frame = [nouvelle position]<br />
    		}<br />
    		completion:^(BOOL finished){<br />
    			// Wait one second and then fade in the view<br />
    		   //Si tu dois faire une action à  la fin de l&#39;animation c&#39;est ici<br />
    		}];<br />
    }<br />
    
  • CéroceCéroce Membre, Modérateur
    Il y a deux méthodes.



    1) Utiliser NSViewAnimation

    Je te le laisse regarder la doc. Ce n'est pas trop compliqué à  comprendre, un peu plus à  mettre en oe“uvre.

    Ces animations sont assez limitées, ne gérant que le changement de frame et l'opacité, par contre, elle maintiennent le lissage des sous-pixels, ce qui est important pour le rendu du texte.



    2) Utiliser Core Animation

    Pour l'instant, je te déconseille d'utiliser CA directement, c'est à  dire en modifiant les propriétés des CALayers.



    Utilise plutôt le proxy de NSView:
    [[vue animator] setFrame:NSMakeRect(100.0, 100.0, 400.0, 300.0)];
    




    Pour que ça fonctionne, il faut absolument que la vue ait une layer associée. Pour cela:
    view.wantsLayer = YES;
    


    ou coche la case correspondante dans le XIB.



    Enfin, il existe une classe NSAnimationContext, qui te servira essentiellement à  changer la durée de l'animation.
  • Oups pardon j'étais persuadé d'avoir vu IOS...
  • J'ai regardé un peu la doc sur NSViewAnimation. Si j'ai bien compris, on crée un objet NSViewAnimation que l'on initialise avec un tableau de dictionnaires. Chaque dictionnaire comportant, en clés, des constantes NS pour savoir à  quel paramètre on s'adresse et en objet associé la "valeur" de ce paramètre (vue ou fenêtre concernée, frame de départ, frame d'arrivée, et fade in/out). Le fait de mettre un tableau permet, je pense, de faire plusieurs animations simultanées. Les questions que je me pose sont les suivantes : quand part l'animation ? Quelle est sa durée ? Peut-on au moins la définir ? Que se passe-t-il pendant l'animation : le programme est suspendu ou bien l'animation se fait en parallèle ?



    Maintenant, autre truc : si on positionne sur une target-view deux subviews qui se superposent (intersection ou égalité entre les frames), que se passe-t-il : on voit les deux à  la fois ? (comme des calques photoshop) C'est la denière arrivée qui prend le dessus ?..
  • CéroceCéroce Membre, Modérateur


    Le fait de mettre un tableau permet, je pense, de faire plusieurs animations simultanées.


    Exact. Je m'en sert personnellement pour une fenêtre de préférences. Le fenêtre possède une NSToolbar. Cliquer un bouton ajuste la hauteur de la fenêtre, et en même temps retire les vues précédentes et ajout les nouvelles avec un fondu.




    Les questions que je me pose sont les suivantes : quand part l'animation ?


    Quand on appelle la méthode -startAnimation.




    Quelle est sa durée ?


    Par défaut, je n'en suis pas sûr, mais je dirais autour d'une demi-seconde.




    Peut-on au moins la définir ?


    Comme NSViewAnimation hérite de NSAnimation, je suppose qu'on peut appeler initWithDuration:animationCurve:, plutôt qu'initWithViewAnimations:.




    Que se passe-t-il pendant l'animation : le programme est suspendu ou bien l'animation se fait en parallèle ?


    L'animation se fait en parallèle.




    Maintenant, autre truc : si on positionne sur une target-view deux subviews qui se superposent (intersection ou égalité entre les frames), que se passe-t-il : on voit les deux à  la fois ? (comme des calques photoshop) C'est la denière arrivée qui prend le dessus ?..


    NSView maintient une hiérarchie ordonnée de vues. C'est la dernière subview qui sera au-dessus, mais forcément si elle n'est pas totalement opaque, on verra l'autre vue en dessous.



    P.S.: Je n'ai pas été assez clair, mais je te conseille plutôt l'approche Core Animation dans cette application.
  • Comme quoi, pour bien connaà®tre une classe il faut connaà®tre ses parents ! J'ai regardé aussi, par curiosité, la classe NSAnimation, parente de NSViewAnimation et ceci complète ce que je devais savoir. De plus, ça m'a appris qu'il existe le protocole de délégation de NSAnimation. Et comme j'ai commencé ce WE à  me familiariser avec les principes des objets assistants (dataSource et delegate pour les NSTableView), ceci me permet d'entrevoir des possibilités.
  • Donc j'ai fait quelques essais avec NSViewAnimtion. Pour ce faire, j'ai commencé par un peu changer le programme. La vue "round" (celle pour compter les points du tour) est affichée la première, calée sur le bord supérieur. Puis, j'affiche la vue "score" (le grand tableau) ,calée au même endroit. Comme elle est affichée en second et qu'elle est totalement occupée par la NSTableView, elle dissimule la vue "round".



    Puis, dans la méthode affichant le "round", je fais coulisser le "score". Je crée un NSValue empaquetant la frame d'arrivée puis je crée mon dictionnaire avec deux clées : la première indiquant la vue concernée (la vue du "score") et la seconde la frame d'arrivée. Puis je lance l'animation . Le résultat est exactement celui que je souhaitais : le "score" glissant vers le bas en dévoilant progressivement le "round". Et pour la méthode masquant le "round", je fais la même chose , en définissant la frame d'arrivée.
Connectez-vous ou Inscrivez-vous pour répondre.