Cada vez que se llama al drawRect de UIView, se borra el contenido dibujado por drawRect anterior (usando Core Graphics). ¿Cómo puedo hacerlo para que las rutas de las llamadas drawRect anteriores se mantengan hasta que lo borre explícitamente?Cómo evitar que drawRect de UIView elimine las rutas dibujadas por llamadas drawRect anteriores?
Respuesta
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
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.
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.
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
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. –
- 1. Actualizar UIView for drawRect?
- 2. Punto de referencia UIView drawRect: método
- 3. Cuándo es - [UIView drawRect:] Método invocado?
- 4. UIView subclase: drawRect no se llama
- 5. Animación para drawRect dibujos
- 6. Esquinas redondeadas de la capa UIView y -drawRect:
- 7. dibujar fuera de los límites de UIView desde drawRect
- 8. NSView drawRect ¿interfiere con las subvistas?
- 9. drawRect en la parte superior de las subvistas
- 10. iOS 5 UIView drawRect override no funciona en el dispositivo
- 11. Quiero animar, de hecho fundir, "dentro" drawRect
- 12. iPhone: ¿por qué no se llama a drawRect?
- 13. setNeedsDisplay no siempre llama a drawRect
- 14. drawRect círculo y anima tamaño/color
- 15. MKAnnotationView drawRect: no se llama
- 16. ¿Cuándo se llama a 'drawRect'?
- 17. Cómo dibujar un UILabel en -drawRect :?
- 18. ¿Cómo puedo dibujar cosas tipo fuera de drawrect?
- 19. Cómo dibujar un UIImage o directamente en -drawRect :?
- 20. iPhone SDK: cómo desencadenar drawRect en la subclase UIView después del cambio de orientación?
- 21. drawrect Vs layoutsubviews - NSView - Cocoa touch
- 22. Cómo llenar una ruta con degradado en drawRect :?
- 23. ¿Cómo fuerzo el redibujado (drawRect) de una Subvista cuando cambia las dimensiones?
- 24. fondo negro al anular drawRect en UIScrollView
- 25. drawRect no se actualiza la pantalla
- 26. drawRect y addSubview: ¿el dibujo personalizado afecta a qué vistas?
- 27. subclassed UITableViewCell - backgroundView cubre todo lo que hago en drawRect
- 28. Fallo en drawRect - ¿qué lo causa?
- 29. El contenido de UIViewScaleFactor depende de la implementación de drawRect :?
- 30. Cómo llamar a drawRect mediante programación en el objetivo c
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