2012-05-30 10 views
59

Al crear una aplicación para iPhone/iPad, ¿no entiendo exactamente cuándo debo 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?¿Cuándo debo llamar a setNeedsDisplay en iOS?

Por ejemplo, necesito para llamarlo:

  • Después de cambiar mediante programación el texto en un campo de texto
  • Al cambiar el fondo de una vista?
  • ¿Cuándo realizo cambios en viewDidLoad?
  • ¿Qué tal en viewDidAppear?

¿Podría alguien darme algunas pautas generales sobre cuándo usar este método? Gracias

Respuesta

122

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 ver 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:

Se tiene una vista que muestra un círculo en movimiento, ya sea que se toca y mueve, o puede ser animación basada en temporizador. Ahora para esto, necesitará una vista personalizada que dibuje un círculo en un centro dado y con un radio dado. 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 ser con los dedos en los métodos toques Enchanted y toquesMoved. Para reflejar el cambio en esta propiedad, necesita volver a dibujar esta vista a la que llamará setNeedsDisplay.

+0

¿Lo mismo para después de cambiar el marco de una capa o ver dentro de mi subclase de vista? –

9

Solo necesita llamar al -setNeedsDisplay en las subclases de UIView que dibujan sus contenidos con -drawRect:.

Para las etiquetas y otros controles estándar, al cambiar el texto, la etiqueta se redibujará automáticamente, por lo que no es necesario que lo haga usted mismo.

5

setNeedsDisplay: debe llamarse cuando desee actualizar su vista de forma explícita. Simplemente establece un indicador interno y el sistema de IU de iOS llamará al drawRect: en el momento apropiado.

Parece que se debe llamar siempre al actualizar 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 IU estándar (vistas), setNeedsDisplay: se desencadenaría internamente y la región afectada se redibujaría.(En todas las situaciones que enumeró)

Sin embargo, si crea su propia vista, implemente su propia drawRect:, y desea actualizar que cuando algo ha cambiado, debe llamar al setNeedsDisplay: explícitamente.

1

Creo @Amogh Talpallikar dejar en claro. Y solo quiero hablar una cosa más.

En el hecho de que, debe evitar anular drawRect a menos que realmente lo necesite, ya que puede causar un mal rendimiento. Puede consultar esta https://yalantis.com/blog/mastering-uikit-performance/

Si sólo quiere un cambio del marco, la posición de los botones, etiquetas, ... Se puede llamar o setNeedLayoutlayoutIfNeeded

1

Va a llamar setNeedDisplay cuando se cambia la propiedad en la que la vista personalizada el dibujo depende. Llamará explícitamente al método drawRect: con fuerza.

Cuestiones relacionadas