2011-08-29 14 views
5

Si tengo una subclase personalizada de UIView que implementa drawRect y los métodos de controlador usan addSubview para crear una jerarquía de vista en esta vista personalizada, ¿cómo interactúa drawRect con estas subvistas? ¿Recrea desde cero la jerarquía de vistas de la subclase completa y elimina las subvistas existentes? ¿O ignora las subvistas y solo vuelve a dibujar una vista/subvista particular?drawRect y addSubview: ¿el dibujo personalizado afecta a qué vistas?

¿Sería aceptable para agregar y quitar mediante programación subvistas dentro drawRect?

Respuesta

7

drawRect está destinado a ser solo para dibujar su contenido en la vista.

Tanto si se dibuja la vista completa o parte de ella: Depende de su aplicación. Si desea hacer alguna optimización, es una buena idea verificar cuándo su vista llama al drawRect y ajustar el código en consecuencia (tal vez desee actualizar solo una parte de la vista, tal vez no desee dibujar todas las veces, etc.) . Depende de sus necesidades

No creo que es una buena idea añadir/eliminar subvistas dentro drawRect ya que este método será llamado en varias situaciones y que se atreven a decir que no es lo que quiere :)

lugar, usted podría intentar algo como esto:

[myView addSubview:aSubview]; 
[myView setNeedsDisplay]; 
//or calculate the needed display rect by yourself and then 
[myView setNeedsDisplayInRect:aRect]; 
+1

mi confusión es sobre cuál de tus subvistas en una clase uiview personalizada se verá realmente afectada por 'drawRect'? 'setNeedsdisplay' no especifica una vista particular ... ¿Redibujará todas y cada una de las subvistas, si están una encima de la otra? – johnbakers

2

-drawRect: no interactúa con subvistas. Dibuja cualquiera que sea la vista a la que se envía y quiere dibujar en el rect que se le da.

¿Sería aceptable agregar y eliminar mediante programación las subvistas dentro de drawRect?

NO.-drawRect: es para dibujar, no para manipular la jerarquía de vista.

+0

Gracias, pero no estoy del todo claro qué vista se actualizará con 'setNeedsDisplay' ya que no está especificando una vista en particular. – johnbakers

+0

-setNeedsDisplay siempre se envía a una vista. – NSResponder

+0

Ah, entonces cuando dice '[someView setNeedsDisplay]' no afectará ninguna subvista de esa vista, que en su lugar se puede volver a dibujar dirigiéndolas directamente como '[someView.subview setNeedsDisplay]', ¿correcto? – johnbakers

Cuestiones relacionadas