2013-03-01 1 views
1

J'ai une application dans laquelle je dessine dans un NSView. Dans mouseDown, je suis en train d'enregistrer l'emplacement dans mon modèle de données, puis de dessiner un graphique à cet emplacement dans la méthode drawRect de la vue. Tout fonctionne bien.Dessin efficace dans NSView drawRect

À la fin de mon mouseDown, j'appelais [self setNeedsDisplay:YES]; pour forcer un redessin. La seule chose est que le dirtyRect est toujours la pleine taille de la vue. Je voulais optimiser cela autant que possible afin que je ne redessine pas toute la fenêtre pour quelques pixels changés.

Alors maintenant j'appelle [self drawRect:...] à la place et en spécifiant le rectangle.

Maintenant, dans mon drawRect je compare chaque graphique que je dois voir s'il tombe dans le dirtyRect. Il semble que j'ai échangé du travail de dessin pour un travail de limites en vérifiant tout. Je ne suis pas sûr d'avoir rendu cela plus ou moins efficace.

Alors, quelle est la pratique standard? Est-il courant de simplement redessiner tout dans la vue et ignorer le dirtyRect? Y a-t-il une bonne fonction que je peux utiliser comme test pour voir si mon objet est dans le dirtyRect?

Répondre

4

Vous ne devriez jamais appeler -drawRect: si vous essayez de dessiner à l'écran. Laissez AppKit l'appeler pour vous. Ce que vous devez faire est d'appeler -setNeedsDisplayInRect: à la fin de votre -mouseDown:.

Ensuite, dans -drawRect:, dessinez uniquement les éléments contenus dans dirtyRect. Vous pouvez tester pour voir si un point est à l'intérieur du dirtyRect avec NSPointInRect(). Il y a beaucoup d'autres fonctions utiles pour travailler avec NSRect. Voir la documentation pour the point functions et the rectangle functions.

+0

Merci, c'est le genre d'information que je cherchais. – spartygw

Questions connexes