NSViewAnimation : euh, comment ça marche ??
Mick
Membre
Bonjour à tous,
J'ai un soucis avec NSViewAnimation.
J'ai une NSBox qui sert de conteneur. J'ai 2 vues qui doivent remplir cette box, selon la sélection d'un NSArrayController. J'ai d'abord commencé par ajouter en brut à la contentView de la box la vue intéressante après avoir supprimé celle qui devait disparaà®tre de la contentView. Cela fonctionne .
Après, je cherchais à animer un peu le changement de vue. Je me suis donc penché sur la doc. Et là , c'est le drame. Je ne comprends pas comment utiliser les NSViewAnimation : Les 2 vues doivent être déjà des subViews de la contentView de la box ?? J'ai essayé de faire comme dans l'ex de la doc, mais j'ai un soucis :
La première fois que l'animation a lieu, cela fonctionne. Les 2 animations (fadeOut d'une vue et FadeIn de l'autre) ont bien lieu nikel.
Après, le fadeOut se déroule bien, mais je ne vois que la fin du fadeIn.
Bref, je ne comprends pas comment cela fonctionne. Si quelqu'un peut m'expliquer plus clairment que la doc ce qui se passe réellement durant ces animations, je suis preneur.
J'ai un soucis avec NSViewAnimation.
J'ai une NSBox qui sert de conteneur. J'ai 2 vues qui doivent remplir cette box, selon la sélection d'un NSArrayController. J'ai d'abord commencé par ajouter en brut à la contentView de la box la vue intéressante après avoir supprimé celle qui devait disparaà®tre de la contentView. Cela fonctionne .
Après, je cherchais à animer un peu le changement de vue. Je me suis donc penché sur la doc. Et là , c'est le drame. Je ne comprends pas comment utiliser les NSViewAnimation : Les 2 vues doivent être déjà des subViews de la contentView de la box ?? J'ai essayé de faire comme dans l'ex de la doc, mais j'ai un soucis :
La première fois que l'animation a lieu, cela fonctionne. Les 2 animations (fadeOut d'une vue et FadeIn de l'autre) ont bien lieu nikel.
Après, le fadeOut se déroule bien, mais je ne vois que la fin du fadeIn.
Bref, je ne comprends pas comment cela fonctionne. Si quelqu'un peut m'expliquer plus clairment que la doc ce qui se passe réellement durant ces animations, je suis preneur.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Toutefois, j'utilise NSViewAnimation pour passer d'un onglet à l'autre dans les Préférences. Ceci vaut de l'or:
Ceci devrait répondre à tes questions.
Mais ce que j'ai du mal à comprendre : la vue n'est pas introduite dans la view hierarchy avant l'anim, donc comment le système "sait" que la vue est une subview de telle ou telle vue de la hierarchie ??
j'essaye de toute façon et je repost
D'après mon code, il ne sait pas, il se contente de faire l'animation, c'est à dire changer l'opacité de la nouvelle vue, mais ceci est fait de façon asynchrone. C'est toujours le addSubview: qui fait d'elle une sous-vue.
Je vais refaire un truc propre pour maintenir la vue courante comme tu l'as fait. (ma méthode est un peu brouillon là !).
Merci Céroce. j'ai enfin compris. (franchement, la doc là , zéro)
Après avoir rendu plus propre la méthode, le résultat n'est pas super convaincant. En effet, l'objectif est de fondre les 2 vues. Lorsque je mets un temps important, je m'aperçois que le fade In n'est jamais fait. la vue est tout bonnement ajoutée !
Voici le bout de code
Mon dieu, mais qu'ai-je fait de mal ?
Mais .. toujours pas. J'ai l'impression que l'ajout de la vue ne se fait qu'après la fin du fadeOut de la oldView. c'est bizarre.
D'autant plus que la PREMIERE animation fonctionne bien, et pas les autres !
Quand il y a un fadeOut de l'ancienne et un fadeIn de la nouvelle, alors la première fois ça se passe bien, puis ça merdoie.
Mystérieux /huh.gif' class='bbc_emoticon' alt='???' />
Autre question : comment zapper les warnings qui me disent que mon controller n'implémente pas les méthodes delegate de NSViewAnimationDelegate protocol ? (je n'ai besoin que de animationDidEnd:)
Dernière chose : si je veux utiliser coreAnimation, comment puis-je récupérer une bitMap de la NSView dessinée afin de remplir un Layer avec et ensuite animer la propriété opacity ?
Du coup, au démarrage de l'animation, la vue afficheraient les 2 layers superposés, leur opacité serait animée, puis à la fin, les layers seraient supprimés et la vue retracée. C'est l'idée ou je suis à coté ?
En appelant setWantsLayer:YES sur une NSView, le dessin se fait dans une CALayer au lieu de l'être directement à l'écran. Note qu'on perd alors le lissage des sous-pixels, le rendu est donc moins bon, c'est flagrant pour les textes.
La doc d'Apple quant à l'interaction NSView/CALayer est pitoyable, j'ai eu toutes les infos sur des blogs ou dans un livre. L'implémentation elle-même n'est pas une réussite, on est très loin d'iOS.
En résumé, si NSViewAnimation te convient, reste-y. Core Animation est plus performante, permet des animations plus poussées, mais c'est au prix d'une grande complexité, et d'heures d'essais. Je dirais que seul un professionnel peut se permettre de faire cet investissement intellectuel.
Je vais essayer de créer une View, d'utiliser ensuite la méthode dataWithEPS.. pour créer au final une CGImage qui pourra "peupler" un Layer. Un fois ça fait, je peux animer les layers, (explicit animation de opacity) et à la fin de l'animation dire à la vue qu'elle n'a plus besoin de layer afin qu'elle trace son contenu par drawRect: . Ne Céroce pas /grin.gif' class='bbc_emoticon' alt=';D' /> ce que fait coreAniation avec ses NSViewAnimation ?
Cette technique pourrait me permettre de concevoir les vues dans IB avant de les animer. et retrouver des vues "conventionnelles" après. En effet, j'ai cru comprendre que les layers ne supportaient pas les actions ! c'est la vue "support" qui les intercepte ! c'est quand même un peu tordu.
À partir de ce moment, tu peux accéder à la propriété .layer de la NSView et faire les anims que tu veux avec. En comprenant bien que c'est la layer qui est animée, pas la NSView. Par exemple, si tu fais une animation qui déplace de 100 points vers la droite, la layer.anchorPoint est déplacé, mais pas la frame de la NSView.
Cependant, NSView a un proxy animator, qui modifie bien la layer et la NSView. Cherche un peu de doc sur les blogs.
Même si je n'en suis pas certain, je pense que NSViewAnimation n'est pas basée sur CoreAnimation. Trois raisons à cela:
1) NSViewAnimation a été introduite dans 10.4, Core Animation dans 10.5.
2) D'après mes tests sous 10.5, les performances ne sont pas les mêmes.
3) Les textes restent bien lisses avec NSViewAnimation.