2011-08-29 16 views
5

Se ho una sottoclasse personalizzata di UIView che implementa drawRect e i metodi del controller utilizzano addSubview per creare una gerarchia di viste in questa vista personalizzata, in che modo drawRect interagisce con tali sottoview? Ricrea da zero la gerarchia di vista dell'intera sottoclasse e rimuove eventuali sottoview esistenti? O ignora le sottoview e ridisegna solo una vista/sottoview particolare?drawRect e addSubview: il disegno personalizzato influisce su quali viste?

Sarebbe accettabile aggiungere e rimuovere a livello di codice subviews entro drawRect?

risposta

7

drawRect è pensato per essere solo per disegnare il contenuto nella vista.

Se disegna l'intera vista o parte di essa: dipende dalla vostra implementazione. Se vuoi fare qualche ottimizzazione è una buona idea controllare quando la tua vista chiama drawRect e aggiustare il codice di conseguenza (magari vuoi aggiornare solo una parte della vista, forse non vuoi disegnare tutte le volte, ecc.) . Dipende dalle vostre esigenze

Non credo sia una buona idea per aggiungere/rimuovere subviews all'interno drawRect perché questo metodo verrà chiamato in diverse situazioni e ho il coraggio di dire che non è ciò che si vuole :)

Invece, si potrebbe provare qualcosa di simile:

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

la mia confusione riguarda quale delle vostre sottoview in una classe personalizzata di uiview sarà effettivamente influenzata da 'drawRect'? 'setNeedsdisplay' non specifica una vista particolare ... quindi ridisegnerà tutte le sottoview, se sono sovrapposte? – johnbakers

2

-drawRect: non interagisce con subviews. Disegna qualunque sia la vista che è stata inviata a voler estrarre nel rect che gli è stato dato.

Sarebbe accettabile aggiungere e rimuovere a livello di codice subviews all'interno di drawRect?

NO.-drawRect: è per il disegno, non per la manipolazione della gerarchia della vista.

+0

Grazie, ma non sono abbastanza chiaro quale vista sarebbe stata aggiornata con 'setNeedsDisplay' dato che non stai specificando una vista particolare. – johnbakers

+0

-setNeedsDisplay viene sempre inviato a una vista. – NSResponder

+0

Ah, quindi quando dici '[someView setNeedsDisplay]' non influenzerà nessuna sottoview di quella vista, che invece può essere ridisegnata indirizzandole direttamente come '[someView.subview setNeedsDisplay]', corretto? – johnbakers