SaveDocument: et layers

MickMick Membre
février 2011 modifié dans API AppKit #1
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 ?

Réponses

  • MickMick Membre
    10:52 modifié #2
    Personne n'a d'idée ?  :'(
    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)
  • mpergandmpergand Membre
    10:52 modifié #3
    Salut,

    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)
  • MickMick Membre
    10:52 modifié #4
    Bonjour ,

    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 ?  >:(
  • chkdskschkdsks Membre
    février 2011 modifié #5
    Pour isoler le problè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&quot;&gt;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.
  • MickMick Membre
    10:52 modifié #6
    Bonjour,

    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"...
  • laudemalaudema Membre
    10:52 modifié #7
    Dans ces cas pourquoi pas faire une application contenant le minimum de ce qui est nécessaire pour reproduire le "bug" et le mettre à  disposition des curieux qui voudront voir pourquoi ça ne fonctionne pas ? (Pas moi je n'ai pas le temps cette semaine mais je pense qu'il y en aura, même pour un sujet aussi peu traité que les Layers).
    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
  • chkdskschkdsks Membre
    février 2011 modifié #8
    Je crois que c'est au niveau du setRepresentedFileName: sur la NSWindow de saveDocument: qu'il y a un problème. Il doit accéder au contexte graphique et faire quelque chose de louche... et comme NSBezierPath l'utilise ça pourrait expliquer le problème.

    <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/GraphicsContexts/GraphicsContexts.html#//apple_ref/doc/uid/TP40003290-CH203-BCIJFBJJ&quot;&gt;Documentation "Graphics Contexts"</a>

    "Each thread in a Cocoa application has its own graphics context object for a given window."
  • MickMick Membre
    février 2011 modifié #9
    Bon, je vais essaiyer la technique Laudema avec une mini-application en essayant de voir ce qui ne colle pas.
    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 !
  • chkdskschkdsks Membre
    10:52 modifié #10
    Quel système utilisez-vous ? la 10.5 ou 10.6, Core Animation et Quicktime ont bien évolué à  la 10.6, je pense qu'un bug est encore plus probable sur la 10.5
  • MickMick Membre
    10:52 modifié #11
    Bon, j'ai utilisé la technique Laudema. Une appli simple document-based, un CALAyer "root" suportée par la contentView de la fenetre, un movieLayer comme subLayer, et les mêmes contraintes midX,midY, width et height : CA MARCHE.

    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
Connectez-vous ou Inscrivez-vous pour répondre.