2009-02-28 682 views

Respuesta

3

Básicamente necesita recortar la parte "sucia" de su rect donde se han realizado cambios, y solo esta parte se volverá a dibujar.

- (void)setNeedsDisplayInRect:(CGRect)invalidRect 
+2

El problema no es que rect no se vuelva a dibujar, sino que cuando se vuelve a emitir drawRect, borra todas las rutas dibujadas anteriores. Parece que ese es el comportamiento predeterminado con la rutina de dibujo de Core Graphic. – Boon

0

Estoy bastante seguro de que no hay forma de evitar esto; es cómo UIView está diseñado para funcionar. Si se le solicita, su vista personalizada debería poder dibujar cualquier parte de sí mismo en cualquier momento. Esto se debe en parte a que las vistas pueden hacer más que solo aparecer en pantalla. p.ej. en el escritorio se pueden imprimir, e incluso en el iPhone, es posible que desee capturar el contenido de una vista en un mapa de bits.

1

Estoy luchando contra este problema yo mismo ahora mismo. El problema es que hay una propiedad en UIView llamada "clearsContextBeforeDrawing" que, según la documentación, debe solucionar este problema, pero no funciona de esa manera en mi experiencia.

Creo que, en última instancia, la solución a esto será asignar un buffer fuera de pantalla y hacer todo mi dibujo allí, luego pasarlo a UIView en el método drawRect.

+1

Sí, eso también plantea OTROS problemas: uno es que iPhone/iPad solo admite RGBA y no RGB, por lo que actualizar la pantalla requiere conversión RGBA-> RGB (que lleva el 99% del tiempo). Además, se borrará la UIView en vano, sin ningún propósito. Si alguien conoce una forma de solucionar estos problemas, ¡por favor haga ping! – gilm

+0

Pensé que el uso de un búfer fuera de pantalla también podría ser la solución (CGLayer/CGRect), pero después de probar esto no hubo una mejora notable en el rendimiento. Parece que el acto de dibujar el contexto de pantalla completa es lento independientemente de la complejidad de las operaciones de dibujo. –

Cuestiones relacionadas