¿Cuándo debo llamar a setNeedsDisplay en iOS?
objective-c swift (5)
Al crear una aplicación de iOS, estoy confundido en cuanto a cuándo exactamente necesito llamar a setNeedsDisplay
? Sé que tiene algo que ver con actualizar / volver a dibujar la interfaz de usuario; sin embargo, ¿debo llamar esto cada vez que cambio alguno de mis puntos de vista?
Por ejemplo, ¿necesito llamarlo?
- Después de cambiar programáticamente el texto en un campo de texto
- Al cambiar el fondo de una vista?
- Cuando realizo cambios en viewDidLoad?
- ¿Qué tal en viewDidAppear?
¿Podría alguien darme algunas pautas generales con respecto a cuándo usar este método?
Creo que @Amogh Talpallikar lo dejó en claro. Y solo quiero hablar una cosa más.
En el hecho de que, debe evitar anular drawRect
menos que realmente lo necesite, ya que puede causar un mal rendimiento. Puede consultar este https://yalantis.com/blog/mastering-uikit-performance/
Si solo quieres cambiar el marco, la posición de los botones, las etiquetas, ... puedes llamar a setNeedLayout
o layoutIfNeeded
Llamarás a setNeedDisplay cuando cambies la propiedad de la que depende tu dibujo personalizado de vista. Llamará explícitamente al método drawRect: con fuerza.
Solo debe llamar a setNeedsDisplay si anula drawRect en una subclase de UIView que es básicamente una vista personalizada que dibuja algo en la pantalla, como líneas, imágenes o formas como un rectángulo.
Por lo tanto, debe llamar a setNeedsDisplay cuando realice cambios en algunas variables de las que depende este dibujo y para que la vista represente ese cambio, debe llamar a este método que internamente llamará a drawRect y redibujará los componentes.
Cuando agrega un imageView o un UIButton como una subvista o realiza cambios en cualquier subvista, no necesita llamar a este método.
Ejemplo:
Tiene una vista que muestra un círculo en movimiento, ya sea que la toque y la mueva, o puede ser una animación basada en el temporizador. Ahora para esto, necesitarás una vista personalizada que dibuje un círculo en un centro dado y con un radio dado. Estos se guardan como variables de instancia que se modifican para mover el círculo cambiando su centro o hacerlo más grande al aumentar su radio.
Ahora, en este caso, o bien va a modificar estas variables (centro o radio) en un bucle y temporizador O puede hacerlo con los dedos en los métodos toques Enchatados y tocaMovimientos. Para reflejar el cambio en esta propiedad, debe volver a dibujar esta vista a la que llamará setNeedsDisplay.
Solo necesita llamar a -setNeedsDisplay
en las subclases de UIView que dibujan sus contenidos con -drawRect:
Para las etiquetas y otros controles estándar, cambiar el texto automáticamente hará que la etiqueta se vuelva a dibujar para que no tenga que hacer esto usted mismo.
setNeedsDisplay:
debe setNeedsDisplay:
cuando desee actualizar su vista de forma explícita. Simplemente establece un indicador interno, y el sistema de interfaz de usuario de iOS llamará a drawRect:
en el momento apropiado más adelante.
Parece que siempre se debe invocar cuando actualiza cualquier propiedad que pueda cambiar la presentación. Pero no lo es. Casi todos los controles UI estándar ya lo manejan. Creo que cada vez que modifique las propiedades de los componentes de UI estándar (vistas), setNeedsDisplay:
se desencadenará internamente y se volverá a dibujar la región afectada. (En todas las situaciones que enumeró)
Sin embargo, si crea su propia vista, implemente su propia drawRect:
y desea actualizarla cuando algo se haya modificado, debe llamar a setNeedsDisplay:
explícitamente.