2009-03-05 6 views
5

J'essaie d'implémenter la fonctionnalité de peinture simple dans mon application iPhone. J'ai essayé de mettre à jour un bitmap avec un pinceau bitmap, et j'ai aussi essayé this tutorial.ne peut pas dessiner assez vite pour suivre les touchesMoved?

Les deux méthodes ont le même problème, même si le code est presque totalement différent. Cela n'arrive que sur l'appareil - le simulateur fonctionne bien.

Lorsque je touche l'écran et bouge le doigt, l'écran n'est pas mis à jour. Lorsque je fais une pause ou que je soulève mon doigt, l'écran est mis à jour. Ce n'est pas une très bonne expérience utilisateur! J'ai essayé d'appeler drawRect depuis touchesMoved directement, mais j'ai trouvé que le contexte de dessin (que je récupère à l'aide de UIGraphicsGetCurrentContext) n'est pas valide pour plusieurs appels, donc peindre l'écran moi-même pour chaque touchesMoved ne fonctionne pas.

Des idées?

Merci pour toute aide, cela a été assez frustrant!

Henning

Répondre

0

Vous ne pouvez pas appeler directement drawRect:. Pour actualiser votre écran à la demande, essayez d'appeler le [self setNeedsDisplay] à partir de votre méthode touchesMoved, qui configurera les contextes appropriés pour un appel à drawRect:.

+0

Merci, mais j'ai essayé de faire un [self setNeedsDisplay] à partir de touchesMoved. Cela n'a pas aidé. – Henning

2

Il me semble que vous ne donnez pas à la boucle d'exécution principale une chance de mettre à jour l'affichage. Votre code de dessin peut être plus long à exécuter que l'intervalle entre les événements tactiles, de sorte que l'affichage n'est jamais mis à jour. Lorsque vous levez votre doigt, il fait la mise à jour car il n'est plus chargé de votre dessin. Vous pourriez envisager d'optimiser votre dessin pour l'accélérer (en dessinant seulement dans la région sale de l'écran, par exemple), en utilisant quelque chose comme NSOperationQueue pour mettre en file d'attente les calculs lourds de votre dessin pour les exécuter sur un thread d'arrière-plan, ou Suppression sélective des événements de dessin tactile pour que votre réponse reste fluide.

Une autre possibilité consiste à placer votre code de dessin lourd dans une méthode séparée et de l'appeler via performSelector: withObject: afterDelay, avec un délai de 10 millisecondes (ou plus petit). Cela pourrait donner à la boucle d'exécution principale une chance de mettre à jour l'affichage avec son état actuel. Je n'ai pas testé cela, mais si je me souviens bien, j'ai vu ce travail.

+0

Je vais essayer et voir comment ça se passe. Je vous remercie. – Henning

Questions connexes