2012-05-30 26 views
59

Durante la creazione di un'app per iPhone/iPad, sono confuso su quando ho bisogno di chiamare setNeedsDisplay? So che ha qualcosa a che fare con l'aggiornamento/ridisegno dell'interfaccia utente; tuttavia, devo chiamare questo ogni volta che cambio una delle mie visualizzazioni?Quando devo chiamare setNeedsDisplay in iOS?

Per esempio, ho bisogno di chiamarlo:

  • Dopo programatically modifica del testo in un campo di testo
  • Quando si cambia lo sfondo di una vista?
  • Quando apporto le modifiche in viewDidLoad?
  • Cosa ne pensi di viewDidAppear?

Qualcuno potrebbe darmi alcune linee guida generali su quando utilizzare questo metodo? Grazie

risposta

122

Si dovrebbe chiamare setNeedsDisplay solo se si ridefinisce drawRect in una sottoclasse di UIView che è fondamentalmente una vista personalizzata che disegna qualcosa sullo schermo, come linee, immagini o forme come un rettangolo.

Quindi è necessario chiamare setNeedsDisplay quando si apportano modifiche a poche variabili da cui dipende questo disegno e per visualizzare tale modifica, è necessario chiamare questo metodo che internamente darà una chiamata a drawRect e ridisegna i componenti.

Quando si aggiunge un imageView o un UIButton come sottoview o si apportano modifiche a qualsiasi sottoview, non è necessario chiamare questo metodo.

Esempio:

Avete una vista che mostra un cerchio in movimento, sia che si tocca e si sposta, o può essere di animazione basato timer. Ora, per questo, avrai bisogno di una vista personalizzata che disegna un cerchio al centro dato e con un raggio dato. Queste sono mantenute come variabili di istanza che vengono modificate per spostare il cerchio cambiando il suo centro o ingrandendolo aumentandone il raggio.

Ora, in questo caso, si modificheranno queste variabili (centro o raggio) in un ciclo e in un timer o potrebbero essere toccate con le dita in mezzo e tocchi i metodi spostati. Per riflettere la modifica di questa proprietà è necessario ridisegnare questa vista per la quale si chiamerà setNeedsDisplay.

+0

Lo stesso per dopo cambiare la cornice di un livello o visualizzare all'interno della mia vista la sottoclasse? –

9

È sufficiente chiamare lo -setNeedsDisplay nelle sottoclassi UIView che ne estrae il contenuto con -drawRect:.

Per le etichette e altri controlli standard, la modifica del testo causerà automaticamente il ridisegno dell'etichetta per cui non è necessario farlo da soli.

5

setNeedsDisplay: deve essere chiamato quando si desidera aggiornare la vista in modo esplicito. Imposta solo una bandiera interna e il sistema dell'interfaccia utente iOS chiamerà drawRect: in un momento appropriato.

Sembra che dovrebbe essere sempre chiamato quando si aggiorna una proprietà che può modificare la presentazione. Ma non lo è. Quasi tutti i controlli dell'interfaccia utente standard lo gestivano già. Credo che ogni volta che si modificano le proprietà dei componenti dell'interfaccia utente standard (viste), setNeedsDisplay: venga attivato internamente e la regione interessata venga ridisegnata.(In tutte le situazioni che hai elencato)

Tuttavia, se si crea il proprio punto di vista, eseguire il proprio drawRect:, e desidera aggiornare che quando qualcosa è stato modificato, è necessario chiamare in modo esplicito setNeedsDisplay:.

1

Penso che @Amogh Talpallikar sia chiaro. E voglio solo discutere di una cosa in più.

Nel fatto che, è necessario evitare l'override di drawRect a meno che non sia effettivamente necessario perché può causare prestazioni non buone. È possibile fare riferimento questo https://yalantis.com/blog/mastering-uikit-performance/

Se solo voglia di cambiamento telaio, la posizione dei pulsanti, etichette, ... è possibile chiamare o setNeedLayoutlayoutIfNeeded

1

Tu chiamerai setNeedDisplay quando si modifica la proprietà su cui la visualizzazione personalizzata il disegno dipende Chiamerà esplicitamente drawRect: metodo con forza.

Problemi correlati