Animation : modification de rayons
Dr_cube
Membre
Salut tout le monde !
C'est mon premier message sur ce forum ! Je suis débutant en Cocoa et je développe une application sur iPhone depuis deux mois environ, dans le cadre d'un stage de fin de 2ème année d'école d'ingénieur.
J'ai un petit problème avec les animations... J'espère que vous pourrez m'aider. J'espère aussi que je poste au bon endroit parce que plusieurs forums semblaient appropriés pour mon problème. J'ai choisi "couche graphique" parce que je pense que mon problème n'est pas spécifique à l'iPhone.
Voici mon problème :
- Je dois respecter un schéma MVC assez stricte.
- Je n'utilise pas IB.
- J'ai une hiérarchie de vues personnalisées qui dessinent des anneaux circulaires imbriqués avec du texte et/ou des images dedans (chaque anneau contient plusieurs sous-vues).
- Je veux faire une méthode qui serait capable d'"ouvrir" ou "fermer" mes anneaux d'un ou plusieurs niveaux à la fois. Le but étant par exemple de supprimer l'anneau le plus au centre, ou d'en faire apparaà®tre un nouveau à partir du centre en poussant les autres vers l'extérieur.
- Le problème c'est que je me perds un peu avec les animations.. Je n'arrive pas à animer le changement de rayon des anneaux.
- J'ai essayé de redimentionner la vue de chaque anneau en calculant le bon facteur de rétrécissement ou d'agrandissement afin de simuler le changement de rayon, mais deux problèmes subsistent : Une fois redimentionné, c'est moche ; si les anneaux sortaient de l'écran, les parties rognées ne sont pas redessinées pendant et après l'animation.
- D'après ce que j'ai compris, si je fais une animation sur le layer associé à la vue (et dans ce cas je déplace tout ce qu'il y a dans le drawRect de la vue dans le drawLayer:inContext), alors je peux faire un setDelegate sur l'animation, et définir une classe (par exemple la vue courante) déléguée qui implémente animationDidStop et animationDidStart. J'aimerais pouvoir utiliser animationDidStop pour être certain que l'animation est terminée, et pouvoir supprimer de la hiérarchie de vues l'anneau qui est le plus au centre (et qu'on ferme dans le cas d'un rétrécissement).
Est-ce que, du haut de votre expérience en graphisme dans Cocoa, vous pourriez m'aider à réaliser cette animation ? Je ne sais vraiment pas comment m'y prendre et j'ai essayé pleins de trucs (animation avec des UIView, CABasicAnimation, CATransition) et ça ne fait jamais ce que je veux.
Merci beaucoup pour votre aide et pour votre patience !
C'est mon premier message sur ce forum ! Je suis débutant en Cocoa et je développe une application sur iPhone depuis deux mois environ, dans le cadre d'un stage de fin de 2ème année d'école d'ingénieur.
J'ai un petit problème avec les animations... J'espère que vous pourrez m'aider. J'espère aussi que je poste au bon endroit parce que plusieurs forums semblaient appropriés pour mon problème. J'ai choisi "couche graphique" parce que je pense que mon problème n'est pas spécifique à l'iPhone.
Voici mon problème :
- Je dois respecter un schéma MVC assez stricte.
- Je n'utilise pas IB.
- J'ai une hiérarchie de vues personnalisées qui dessinent des anneaux circulaires imbriqués avec du texte et/ou des images dedans (chaque anneau contient plusieurs sous-vues).
- Je veux faire une méthode qui serait capable d'"ouvrir" ou "fermer" mes anneaux d'un ou plusieurs niveaux à la fois. Le but étant par exemple de supprimer l'anneau le plus au centre, ou d'en faire apparaà®tre un nouveau à partir du centre en poussant les autres vers l'extérieur.
- Le problème c'est que je me perds un peu avec les animations.. Je n'arrive pas à animer le changement de rayon des anneaux.
- J'ai essayé de redimentionner la vue de chaque anneau en calculant le bon facteur de rétrécissement ou d'agrandissement afin de simuler le changement de rayon, mais deux problèmes subsistent : Une fois redimentionné, c'est moche ; si les anneaux sortaient de l'écran, les parties rognées ne sont pas redessinées pendant et après l'animation.
- D'après ce que j'ai compris, si je fais une animation sur le layer associé à la vue (et dans ce cas je déplace tout ce qu'il y a dans le drawRect de la vue dans le drawLayer:inContext), alors je peux faire un setDelegate sur l'animation, et définir une classe (par exemple la vue courante) déléguée qui implémente animationDidStop et animationDidStart. J'aimerais pouvoir utiliser animationDidStop pour être certain que l'animation est terminée, et pouvoir supprimer de la hiérarchie de vues l'anneau qui est le plus au centre (et qu'on ferme dans le cas d'un rétrécissement).
Est-ce que, du haut de votre expérience en graphisme dans Cocoa, vous pourriez m'aider à réaliser cette animation ? Je ne sais vraiment pas comment m'y prendre et j'ai essayé pleins de trucs (animation avec des UIView, CABasicAnimation, CATransition) et ça ne fait jamais ce que je veux.
Merci beaucoup pour votre aide et pour votre patience !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
J'ai avancé un peu, mais je suis toujours coincé donc je reformule mon problème :
- J'ai toujours mes anneaux concentriques que je veux rétrécir dans une belle animation.
- Je supprime l'anneau le plus au centre en le faisant réduire au maximum tout en disparaissant.
- Par contre je veux réduire légèrement chacun des anneaux les plus extérieurs (pour combler le vide de l'anneau supprimé). Il y a dès lors deux problèmes :
- Si un anneau ne rentrait pas en entier sur l'écran, il reste rogné lors de l'animation. Je n'arrive pas à résoudre ce problème.
- Je sais faire une réduction avec les bounds des layers, mais mes anneaux ont tous la même épaisseur quel que soient leurs rayons, et avec une telle animation ils sont beaucoup plus fins à la fin, ce qui ne me convient pas.
J'aimerais donc créer une animation qui anime la réduction du rayon de mes anneaux (le rayon est une propriété que j'ai ajouté dans ma classe RingView qui hérite de UIView), et redessiner avec drawRect: ou drawLayer:InContext: à chaque pas de l'animation. Cela résoudrait d'un seul coup mes deux problèmes !
Mais je n'arrive pas à trouver comment créer ce genre d'animations très personnalisées. Il s'agit très certainement d'une animation classique (avec une boucle de rendu), mais je ne sais pas faire. Est-ce que quelqu'un peut me mettre sur une piste ? Je ne trouve rien pour m'aider dans la doc d'Apple ou sur le Web. C'est assez urgent, et je cherche en vain depuis des jours ..
Merci infiniment pour votre aide !
J'offre un bonbon à celui qui saura me mettre sur la voie !
Au secours :why?:
Edit : j'ai relu toute la doc iPhone sur les animations. Il n'y a rien en dehors de Core Animation. Je ne trouve pas comment animer autre chose que des propriétés de layer.
Je pense donc que la meilleure solution est de faire une boucle de rendu manuellement, mais je ne sais pas comment on fait ;_;.
iPhone Dev Center > iPhone Reference Library > Topics > Graphics & Animation: Animation > Animation Types and Timing Programming Guide >
La property "timing Function" est sans doute intéressante.
Pour Core Animation, ces pages peuvent peut-être t'aider ...
Filter_Frame_Animation
et Actions
Eaglelouk : Tu peux me filer le lien vers le site qui propose cet eBook ? J'ai pas envie de prendre le mauvais bouquin...
Edit : j'adore les expressions qui ont été utilisé pour décrire l'ancienneté des membres : torréfacteur, artisan chocolatier ^^. C'est super bien trouvé ^^.
Bon ben voilà , j'ai parcouru en diagonale le pdf : un bon livre d'initiation, avec un commentaire très développé. Les exemples (code dispo sur le site) me semblent plus simples (du niveau de ce qu'il dans le Core Animation Programming Guide) que ceux que j'ai présentés sur le site Core Animation, sans contenir les réponses que j'ai laissées en suspens sur ces pages ...