Effet de survol: NSTrackingArea
Rocou
Membre
Bonjour,
Je suis toujours sur le développement de mon application de location. Elle avance bien, je suis en train de tester les effets de survol. Cela fonctionne mais je me pose les questions suivantes:
- Pour créer mes NSTrackingArea, je ne passe pas par la méthode viewDidMoveToWindow car le nombre et la position de ces zones peuvent changer (ce sont les colonnes de mon planning, cf image ci-jointe).
Je crée ces zones dans une boucle du style:
On est susceptible de passer plusieurs fois dans ce bout de code en fonction de la valeur de tailleCalendrier qui peut être modifiée.
Je me demande donc si toutes ces zones de tracking ne vont pas s'accumuler en mémoire et finir par me bouffer toutes mes ressources. Faut-il détruire ces zones avant de les recréer?
Si oui, comment?
Je suis toujours sur le développement de mon application de location. Elle avance bien, je suis en train de tester les effets de survol. Cela fonctionne mais je me pose les questions suivantes:
- Pour créer mes NSTrackingArea, je ne passe pas par la méthode viewDidMoveToWindow car le nombre et la position de ces zones peuvent changer (ce sont les colonnes de mon planning, cf image ci-jointe).
Je crée ces zones dans une boucle du style:
for(i =0;i<tailleCalendrier;i++)<br /> { <br /> monRect.origin.x = ColonneX;<br /> monRect.origin.y = origineLocationY;<br /> monRect.size.height= bounds.size.height;<br /> monRect.size.width = largeurColonneDefaut;<br /> //On incrémente ColonneX pour passer à la colonne suivante<br /> ColonneX = ColonneX + largeurColonneDefaut;<br /> <br /> //On ajoute une zone de tracking<br /> [self addTrackingRect:monRect<br /> owner:self<br /> userData:nil<br /> assumeInside:NO];<br /> <br /> } <br />
On est susceptible de passer plusieurs fois dans ce bout de code en fonction de la valeur de tailleCalendrier qui peut être modifiée.
Je me demande donc si toutes ces zones de tracking ne vont pas s'accumuler en mémoire et finir par me bouffer toutes mes ressources. Faut-il détruire ces zones avant de les recréer?
Si oui, comment?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
- soit tu crées une classe par colonne, qui maintiens la NSTrackingArea.
- soit tu accumules toutes des NSTrackingArea dans un NSMutableArray, que tu vides quand il y a besoin.
Par contre, si je dis pas de bêtises, tu mélanges deux concepts:
les tracking Rect et les NSTrackingArea.
Les Tracking Rect sont l'ancienne méthode. NSTrackingArea est la nouvelle, plus flexible et plus simple (mais 10.5 minimum, je crois). La doc d'Apple n'est pas très claire à ce sujet.
Cela allégerais peut etre un peu la charge de travail dy système dédié à la gestion des trackingRect.
Oui, cela semble plus simple et sûrement plus performant. Peut-on modifier dynamiquement un NSTrackingArea?
Effectivement, Céroce, je confondais l'ancienne méthode avec la nouvelle.
Par contre tu seras effectivement forcé de supprimer pour ajouter un nouveau tracking, meme si tu veux simplement en modifier un. Du moins dans la classe je ne vois que des getter.
Bon, effectivement, ça fonctionne beaucoup mieux!
Mais j'ai encore une question. Voici mon code:
Bon en fait, j'ai viré toute notion* de "TrackingArea" et j'ai tout reprogrammé avec mouseMove. C'est bien plus simple et très efficace.
J'ai juste un petit "bug". Ma vue peut "scroller". Si on utilise la roulette de la souris, la vue scrolle mais la souris ne bouge pas. Par conséquent, mon affichage géré par mouseMove ne se fait pas...
(NB: je n'ai pas viré "toute notion" mais bon...)
C'est quoi mousewheel:?
Je suis passé par les notifications pour récupérer les données de scroll. une méthode "mousewheel:" aurait été bien pratique!
Mouse Wheel c'est simplement un scroll avec la molette
Et bien merci car de mon côté mouseWheel n'apparait pas dans la doc Apple intégrée à xCode
Ha ok
Je vais tester ça.
EDIT: grrrr. En fait j'avais déjà testé. ça ne fonctionne pas comme je le voudrais (ne permet pas de faire scroller les ascenseurs)
Tu peux tenter de surclasser ta NSScrollView et d'intercepter le scrollWheel (sans oublier l'appel à super) et envoyer une notification à ta vue pour quelle recalcule les trackingRect...
à‰videmment je suis novice en programmation Cocoa il doit y avoir une solution plus élégante.