méthode drawRect, NSImage et conseils de debug
tethys
Membre
Bonjour,
en réalisant une appli qui redessine une pièce sur une vue cible, j'ai quelquefois le dessin qui se passe bien, et d'autres fois rien qui ne se passe,
mes traces passent pourtant au même endroit et je n'arrive pas à trouver de conditions systématiques qui expliqueraient l'un ou l'autre des comportements (dessin correct ou dessin inexistant),
auriez-vous un conseil de méthode pour debugger ces problèmes liés à drawRect, à part tracer le paramètre de l'image que l'on redessine,
sinon, est-ce que mon dessin sur ma vue peut être perturbé par le fait de dessiner sur une autre vue en même temps ?
(c'est fait à la fin d'un drop qui fait un drawRect dans ma vue source)
en réalisant une appli qui redessine une pièce sur une vue cible, j'ai quelquefois le dessin qui se passe bien, et d'autres fois rien qui ne se passe,
mes traces passent pourtant au même endroit et je n'arrive pas à trouver de conditions systématiques qui expliqueraient l'un ou l'autre des comportements (dessin correct ou dessin inexistant),
auriez-vous un conseil de méthode pour debugger ces problèmes liés à drawRect, à part tracer le paramètre de l'image que l'on redessine,
sinon, est-ce que mon dessin sur ma vue peut être perturbé par le fait de dessiner sur une autre vue en même temps ?
(c'est fait à la fin d'un drop qui fait un drawRect dans ma vue source)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Non, il ne faut pas appeler drawRect directement !
mais SetNeedsDisplay ou setNeedsDisplayInRect:
Tu dois utiliser SetNeedsDisplay pour indiquer que le contenu d'une vue n'est plus valable, pour que l'OS puisse la redessiner en tenant compte des autres opérations graphiques en cours.
Comme mpergand et Draken l'ont dit, si tu utilises SetNeedsDisplay, cela ne peux pas arriver et ne veux même rien dire.
Tu ne peux pas dessiner "en même temps" dans 2 vues.
Elles seront mises à jour l'une après l'autre par 2 procédures drawRect différentes appelées par 2 SetNeedsDisplay (1 pour chaque vue).
je n'appelle jamais la fonction directement mais bien
seulement je le fais dans deux vues différentes (avec deux méthodes drawRect donc) et également dans mon controlleur (qui fait un setImage d'une vue, accesseur qui fait lui-même un setNeedsDisplay)
c'est juste une supposition, quelles peuvent être la cause de tels problèmes d'affichage, non systématiques ? - à part des appels directs à drawRect -
Ensuite, il y a des choses plus évidentes:
- couleur blanche ou totalement transparente
- épaisseur du trait trop fine
- dessin en dehors de la vue (ça arrive souvent lorsqu'on travaille avec les matrices).
Pour déboguer, NSLog() pour l'affichage des coordonnées est souvent une bonne solution parce que ça n'interrompt pas le programme.
J'ai personnellement mes propres NSLog() pour un point, un rectangle et une matrice.
Quand on fait du graphisme, il y a toujours des petits algos pour calculer l'emplacement des éléments, etc. Je ne saurais que trop te conseiller de bien séparer chaque algo dans une méthode ou fonction pour pouvoir regarder au débogueur les paramètres d'entrée et ce que tu obtiens en sortie.
Pour finir, deux applis qui servent souvent: Pixie pour voir si tu dessines bien au bon endroit (au pixel près), et Quartz Debug qui permet de voir les rafraà®chissements (parfois inutiles) d'écran.
mais je devrais trouver car j'avais backupé une version 'stable' avant des modifs.
je découvre aussi ces outils Pixie et quartz Debug
Mac fournit quand même une panoplie d'outils d'aide au dev qui semblent bétons et gratuits, rien que le FileMerge est très utile,
d'ailleurs au sujet de FileMerge, est-il possible de modifier les fichiers en comparaison en 'transférant' une des modifs à l'autre fichier ? c'est ce qui manque pour en faire un outil à la hauteur d'un ExamDiff Pro sous Windows,
Oui.