un Giff animé dans une appli Cocoa
ClicCool
Membre
Bonjours à tous,
Je suis pas du tout, mais alors pas du tout calé sur le coté Graphique de cocoa.
Mais voilà , j'aimerais bien placer un gif animé dans la fenêtre de document.
Juste en élément "décoration", pas en lien direct avec le modelView quoi.
ça peut se faire aussi simplement que l'ajout de celui-ci:Â :spot: dans ce post ?
Merci pour vos lumières
Je suis pas du tout, mais alors pas du tout calé sur le coté Graphique de cocoa.
Mais voilà , j'aimerais bien placer un gif animé dans la fenêtre de document.
Juste en élément "décoration", pas en lien direct avec le modelView quoi.
ça peut se faire aussi simplement que l'ajout de celui-ci:Â :spot: dans ce post ?
Merci pour vos lumières
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Donc à mon avis, il te faut une NSImageView côté IB, et une méthode pour l'affichage de la trame côté Xcode dans le controleur (sans parler d'une modif mineure du awakeFromNib...).
.
Il me faut donc un NSTimer ou plutot utiliser NSThread ?
Quelle voie me conseilles tu pour une simple patite animation décorative ?
Bon, vraiment parce que c'est toi !
dans le .h du controleur :
et dans le .m :
.
En plus, les mecs doués trouvent encore le moyen de travailler le samedi pour progresser.
Désespérant. :crackboom:-
merci Bru :-* ::)
Sans toi j'aurais mis des heures à trouver la bonne façon de gérer ce type d'image et tout et tout ...
Mais j'abuse peut-être mais j'ai des erreurs qui me font penser que peut-être mes gif ne sont pas au bon format ?
à chaque "valueForProperty" je reçois un:
On dirait que je n'ai qu'un array d'image et pas un dictionaire ou autre formormat plus élaboré
peux tu me dire si mon gif animé qui me sert de test est convenable pour ce code ?
Je le t'atache à mon code en bas (mais c'est un des émoticones d'O.C. mais je l'ai peut-être pas récupéré dans le bon format, faut que je le convertisse ?)
[Fichier joint supprimé par l'administrateur]
Je pense que le problème ne vient pas de l'image.
Merci Oxitan, (à en juger par ton avatard t'as pris un sérieux coup de vieux ! ;D )
En effet toutes les images sont bien présentes semble-t-il.
Mais peut être que le code attend un NSBitmapImageRep plus complet.
C'est vrai aussi qu'à la compil j'ai déjà un:
pour la ligne:
???
Je suspecte un problème de fuite de mémoire...
Je te joins le projet XCode que j'ai fait pour tester mon code avant de le poster.
.
[Fichier joint supprimé par l'administrateur]
ton code marche impec
C'est de mon coté que ça foire
Merci Bru
Je poursuis mes investigations pour comprendre mon pb avec tous les éléments qu'il faut maintenantÂ
après n essais, de guerre lasse, j'ai sauvagement fait un copier coller entre ton .m et le mien et ... ça marche impec. !Â
Le pb c'est que du coup je suis incapable de dire ce qui ne collait pas dans mon code, ce qui est bien domage pour ce qui est de mon apprentissage
Mais bon MERCI BRU, :trinque:
c'est drolement chouette ces gifs animés :spot:
Et en plus j'ai tout de même appris pas mal de trucs sur cet aspect de la programmation Cocoa que je n'avais jamais touché encore.
Promis, demain je réécrit tout depuis zéro et décortique encore une fois tout ça, et si je trouve mon erreur initiale j'en fait profitter le forum.
Peux tu me filer tes 2 fichiers (le m et le h) pour que j'y jette un oeil ?
.
Oh en voilà un avatard sympa !
Salut Bru
Le pb c'est que c'est dans le .m que se situait le pb et qu'après mon copier-coller + build and Run il ne reste rien de mon fichier d'origine.
Je vais essayer de reprendre à zéro et peut-être de provoquer la même erreur, si j'y parvien je t'envoies les fichiers car j'aimerai bien comprendre ???
Pour l'heure ça marche impec :brule:
Merci encore Bru
Une précision au sujet de ce sympathique code.
Le timer ne sera jamais désaloué et, lors de la déallocation de la vue connectée, le timer risque de planter l'Appli.
Le mieux semble donc d'appeler [timer invalidate] lors de la déallocation de la vue ou de son controller. ::)
Autre chose, l'instance rep_gif compte un retain mais pas de release, donc fuite mémoire. Méthode dealloc: a ajouter
Là le code est plus propre
Pas encore tout à fait Eddy
Ta méthode dealloc risque fort de ne jamais être appelée ::)
En effet il me semble que dans la mesure ou la "target" du timer est ici self (le controller qui l'a crée) la méthode dealloc ne sera jamais appelée car un Timer retient sa cible !
Dans un shéma où on a un Contrôleur (qu'on appèlera par exemple DayZunPau) qui instancie un contrôleur de gif animé (qu'on appèlera Catherine ou plus simplement GifAnimCtrl) (contenant le code de Bru)
Le mieux est sans doute d'implémenter au gifAnimCtrl une méthode invalidateTimer en plus de dealloc
Le contrôleur général DayZunPau devra d'abord appeler [monGifAnimCtrl invalidateTimer]
Le timer enverra alors un release à sa target (ici l'instance de gifAnimCtrl) qui alors seulement verra sa méthode dealloc appelée, libérant enfin le rep_gif.
Me gourres-je ? ::)
Ce détail fort important ne m'avait même pas effleuré l'esprit.... ::)
Je pense que tu as raison, dans ce cas ta théorie est pas mal, dans ton contrôleur DayZunPau (quel drôle de nom ), tu envoies à quel moment le message au sous-contrôleur pour dévalider le timer ? Tu fais un appel direct dans la méthode dealloc: ou bien il faut détecter la fermeture de l'appli ?
Le timer est peut-être autoreleasé mais si son controller n'est jammais releasé parce que l'objet qu'il a créé le retient, on va au devant de pb.
Et puis autoreleasé oui et non car, si rien de le retient, après une boucle du runLoop adieu Berthe (une copine elle aussi ) ???
En fait je crois que le timer est retenu par le runLoop lui même et pas par l'objet qui l'a créé.
D'autant qu'il ne me parrait pas certain que le Timer soit jamais désalloué une fois qu'il est dans le runLoop, il semble simplement désactivé et relache sa cible ... mais bon les runLoop ne sont pas simple à analyser et je ne suis pas certain de ce point. :-\
Par ailleurs mon petit usage du code de Bru (saluons le encore au passage ) est affecté à des documents (dans la toolBarr). Donc ce n'est pas quand l'appli quitte mais à chaque fermeture d'un document qu'il faut veiller à la bonne déallocation du timer qui, dans mon projet se passe bien depuis que j'ai ajouté le bout de code appelé par mon contrôleur général DayZunPau. Un bon gras finalement ce contrôleur DayZunPau ;D
Mais les timers sont des objets assez particuliers de par leur intégration dans la runloop, et quelque chose me dis qu'ils ont été conçus dans la même optique de fonctionnement que les constructeurs de commodités, c'est à dire ne pas se préoccuper de leur sort
Je vais partir à la recherche d'exemples avec NSTimer pour qu'on en sache un peu plus, car ça me paraà®t louche cette histoire de contrôleur DayZunPau. ;D
Voici ce que j'ai glané sur CocoaDev.com :
La dernière phrase parle de notre cas : "Cependant, si vous ne voulez pas stopper le timer avant que l'application ne quitte, ou si le timer ne se répète pas, vous pouvez le libérer après l'avoir "schéduler" sans appeler invalidate."
-> Notre timer est schédulé si je puis dire , et l'autorelease s'occupe de sa libération.
Il y a aussi le tutoriel Animation graphique avec Cocoa, Partie 1, sur O'Reilly. En regardant le projet complet, le timer est mis dans la runloop sans le stocker dans une variable :
Et l'animation ne prend fin que quand on quitte l'appli, comme dans notre cas. Donc avec ces deux éléments, je pense vraiment de plus en plus fort qu'il est inutile de gérer l'invalidation du NSTimer à la sortie de l'appli. 8) ;D
Mon timer devient invalide avec une référence sur une vue qui n'existe plus à chaque fois que je ferme un document, pas seulement en quitant l'application
le gif animé est dans LES fenêtres de document
Je suis obligé d'invalider le timer du document AVANT de désallouer sa fenêtre ... sino plantage sur appel d'une image qui a été désallouée
Dans ton cas, en document-based, c'est en effet plus délicat, et ta méthode est bien trouvée en effet.
???
pas glop ! ;D
T'as raison c'est pas glop pas glop ça.
J'aurais du ajouter un .../... dans le post pour figurer le coté "extrait" de code plutot que de fermer l'accolade. :-\
Merci de ta précision cbrandt  :D