2009-03-05 6 views
5

Estoy tratando de implementar la funcionalidad de pintura simple en mi aplicación de iPhone. Traté de actualizar un mapa de bits con un pincel de mapa de bits, y también intenté this tutorial.no puede dibujar lo suficientemente rápido para mantenerse al día con los toques ¿Movido?

Ambos métodos tienen el mismo problema, aunque el código es casi totalmente diferente. Sucede solo en el dispositivo: el simulador funciona bien.

Cuando toco la pantalla y muevo el dedo, la pantalla no se actualiza. Cuando hago una pausa o levanto mi dedo, la pantalla se actualiza. ¡Esta no es una muy buena experiencia de usuario!

Intenté llamar a drawRect desde touchesMoved directamente, pero encontré que el contexto del dibujo (que recupero usando UIGraphicsGetCurrentContext) no es válido para muchas de las llamadas, por lo que pintar la pantalla por cada toquesMoved no funciona.

¿Alguna idea?

¡Gracias por cualquier ayuda, esto ha sido bastante frustrante!

Henning

Respuesta

0

No se puede llamar directamente drawRect:. Para refrescar la pantalla en la demanda, intente llamar [self setNeedsDisplay] de su método touchesMoved, que configura los contextos adecuados para una llamada a drawRect:.

+0

Gracias, pero he intentado hacer un [auto setNeedsDisplay] de touchesMoved. No ayudó. – Henning

2

Me parece que no le está dando al bucle de ejecución principal la oportunidad de actualizar la pantalla. Es posible que el código de dibujo tarde más en ejecutarse que el tiempo transcurrido entre los eventos táctiles, por lo que la pantalla nunca se actualiza. Cuando levantas el dedo, realiza la actualización porque ya no está cargado con tu dibujo.

Puede considerar optimizar su dibujo para acelerarlo (dibujando solo dentro de la región sucia de la pantalla, por ejemplo), usando algo como NSOperationQueue para poner en cola los cálculos pesados ​​de su dibujo para ejecutar en un hilo de fondo, o seleccionando eventos de dibujo táctiles selectivamente para mantener su respuesta sin problemas.

Una posibilidad adicional es colocar su código de dibujo pesado en un método aparte y llamarlo a través de performSelector: withObject: afterDelay, con un retraso de 10 milisegundos (o menor). Esto podría dar al bucle de ejecución principal la oportunidad de actualizar la pantalla con su estado actual. No lo he probado, pero si recuerdo correctamente, he visto este trabajo.

+0

Voy a intentarlo y ver cómo va. Gracias. – Henning

Cuestiones relacionadas