SaveDocument: et layers
Mick
Membre
Bonjour à tous.
Voici un soucis qui me rend très perplexe :
J'ai une vue qui utilise des layers (2 CALayers et 1 QTMovieLayer). Tout fonctionne parfaitement (je gère les événements via la vue, et je maintiens la position des layers grâce à un constraintManager). Le problème survient quand j'appelle la méthode save: => le contenu des layers disparaà®t ! Je pensais que j'avais un soucis de "rafraà®chissement" à cause du panel qui s'ouvre devant la vue, mais lorsque j'ouvre "manuellement" un panel, il n'y a aucun soucis. C'est uniquement au moment du "save:" qu'il se passe quelque chose, (mais quoi ???). Que fait cette méthode save: pour me flinguer mes CALayers ? (j'ai bien sûr essayé de rafraà®chir les layers à la fin de la méthode writeToURL:ofType:Error:, mais que néni...
Quelqu'un aurait-il une idée sur ce qui se passe ?
Voici un soucis qui me rend très perplexe :
J'ai une vue qui utilise des layers (2 CALayers et 1 QTMovieLayer). Tout fonctionne parfaitement (je gère les événements via la vue, et je maintiens la position des layers grâce à un constraintManager). Le problème survient quand j'appelle la méthode save: => le contenu des layers disparaà®t ! Je pensais que j'avais un soucis de "rafraà®chissement" à cause du panel qui s'ouvre devant la vue, mais lorsque j'ouvre "manuellement" un panel, il n'y a aucun soucis. C'est uniquement au moment du "save:" qu'il se passe quelque chose, (mais quoi ???). Que fait cette méthode save: pour me flinguer mes CALayers ? (j'ai bien sûr essayé de rafraà®chir les layers à la fin de la méthode writeToURL:ofType:Error:, mais que néni...
Quelqu'un aurait-il une idée sur ce qui se passe ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je m'y prends peut-être mal en utilisant des CALayers ? Mon objectif est d'avoir une vue dans laquelle doivent s'afficher une image ou un QTMovie, et sur le/laquel/le je doit dessiner "en incrustation" des choses (des bezierspath). J'ai donc au départ commencé par essayer de créer une NVIEw perso, dans laquelle j'ajoutais des subviews, mais j'avais un peu de mal à organiser tout ça, et j'ai trouvé sur une liste de diffusion Apple une réponse à quelqu'un qui avait le même genre de soucis : cette réponse conseillait d'utiliser des layers. Ce que j'ai fait .... et cela marche très bien ... jusqu'à ce que je fasse un pomme-S ! là , le layers auquel j'ai attribué une image (setContent:) et le QTMovieLayer "disparaissent". Seul le layer qui contient mes bezierspaths reste accessible et se redessine après la sauvegarde quand je fait un setNeedsDisplay. Le layer "image" et le qtmovielayer restent déserpérément sans contenu. Au debug, ils semblent exister pourtant (not nil)
Je n'ai jamais utilisé les layers ...
Regarde si la position et la taille des views a été modifiées (width/height=0, ou x/y en dehors de la fenêtre)
J'ai regardé au debug, mes layers n'ont pas de soucis de width/height ni d'origine ! Je ne comprends pas. J'ai l'impression qu'un "display" suffirait, mais rien n'y fait. Et puis pourquoi le contenu des layers est effacé dès que je fais un pomme-S ? il y a sûrement une raison, mais je vois pas !
Can somebody help me ? >:(
1) Vous pouvez comparer votre code à celui-ci (qui est plus simple par contre) :
<a href="http://developer.apple.com/library/mac/#samplecode/CoreAnimationQuickTimeLayer/Introduction/Intro.html">Core Animation avec Quicktime</a>
Le fil d'exécution de saveDocument: est expliqué à cette page :
<a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Documents/Articles/ObjectInteractions.html#//apple_ref/doc/uid/TP40003196-SW2">Architecture en document</a> (voir la partie : "Saving a document")
2) Si vous commentez les fonctions de dessin "manuelles", est-ce que cela le fait ? faire attention à tout ce qui touche le contexte graphique puisqu'il est partagé, pour voir ce qui se rafraà®chit, utilisez l'application "Quartz Debug" fournie avec Xcode (dossier "Graphics Tools").
3) Vous pouvez aussi essayer d'appliquer des contraintes plus drastiques à vos layers juste le temps de faire la sauvegarde... pour voir si ça continue.
Pour un des layers, j'utilise un delegate pour fournir le contenu, et j'utilise des beziersPath => Lorsque que je clique à nouveau sur ma vue après la sauvegarde, une méthode est appelée et force un needsDisplay : ce layer est à nouveau redessiné. Par contre le qtmovielayer et le CALayer auxquels j'ai juste fourni le contenu à leur initialisation restent désepérément vides.
J'ai lu les docs sur le mécanisme de sauvegarde, mais je ne vois pas du tout pourquoi le contenu des layers se trouve "effacés"...
En plus à chaque fois que j'ai voulu faire ça pour un de mes problèmes ça m'a permis de trouver tout seul pourquoi ça ne fonctionnait pas.
hth
<a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/GraphicsContexts/GraphicsContexts.html#//apple_ref/doc/uid/TP40003290-CH203-BCIJFBJJ">Documentation "Graphics Contexts"</a>
"Each thread in a Cocoa application has its own graphics context object for a given window."
Sinon, chkdsks, c'est plutôt mes bezierspath qui "se portent mieux" que les "automatismes" de QTMovieLayer et CALayer initialisé avac un setContent. .
J'envisage tout simplement de faire moi-même une méthode save et ainsi gérer tout ça. Les mécanismes cocoa c'est bien... mais c'est parfois bien obscur !
Ca veut donc dire qu'il se passe un truc au sein de mon appli qu'il faut que je trouve (je vous explique pas la galère...) En tout cas merci