Per chiarire lo scopo di questa domanda: so COME creare viste complicate con entrambe le viste secondarie e usando drawRect. Sto cercando di comprendere appieno quando e perché usare l'uno sull'altro.
Capisco anche che non ha senso ottimizzare molto prima del tempo e fare qualcosa di molto più difficile prima di fare qualsiasi profilazione. Considera che mi sento a mio agio con entrambi i metodi e ora voglio davvero una comprensione più profonda.
Gran parte della mia confusione deriva dall'imparare a rendere le prestazioni di scorrimento della vista tabella davvero fluide e veloci. Naturalmente la fonte originale di questo metodo è dell'autore dietro twitter per iPhone (precedentemente tweetie). Fondamentalmente dice che per rendere più fluido lo scrolling delle tabelle, il segreto è NON usare le sottoview, ma invece fare tutto il disegno in un'unica vista personalizzata. Fondamentalmente sembra che l'uso di molte sottoview rallenta il rendering perché hanno un sacco di costi generali e sono costantemente ricomposti sulle loro visioni padre.
Ad essere onesti, questo è stato scritto quando il 3GS era piuttosto nuovo di zecca, e iDevices sono diventati molto più veloci da allora. Tuttavia questo metodo è regolarmente suggerito su interwebs e altrove per tabelle ad alte prestazioni. In realtà è un metodo suggerito nel Table Sample Code di Apple , è stato suggerito in diversi video del WWDC ( disegno pratico per sviluppatori iOS ) e in molti libri di programmazione iOS .
Ci sono anche strumenti fantastici per progettare la grafica e generare il codice Core Graphics per loro.
Quindi all'inizio sono portato a credere "esiste un motivo per cui esiste Core Graphics. È VELOCE!"
Ma non appena penso di avere l'idea "Favorisci la grafica di base quando possibile", comincio a vedere che drawRect è spesso responsabile della scarsa reattività in un'app, è estremamente costoso in termini di memoria e tassa davvero la CPU. Fondamentalmente, dovrei " Evitare di ignorare drawRect " ( Prestazioni delle app iOS del WWDC 2012 : grafica e animazioni )
Quindi immagino che, come tutto, sia complicato. Forse puoi aiutare me stesso e gli altri a capire quando e perché usare drawRect?
Vedo un paio di ovvie situazioni per usare Core Graphics:
- Hai dati dinamici (esempio di grafico azionario di Apple)
- Hai un elemento dell'interfaccia utente flessibile che non può essere eseguito con una semplice immagine ridimensionabile
- Stai creando un elemento grafico dinamico, che una volta eseguito il rendering viene utilizzato in più punti
Vedo situazioni per evitare Core Graphics:
- Le proprietà della vista devono essere animate separatamente
- Hai una gerarchia di vista relativamente piccola, quindi qualsiasi sforzo extra percepito usando CG non vale il guadagno
- Vuoi aggiornare parti della vista senza ridisegnare il tutto
- Il layout delle visualizzazioni secondarie deve essere aggiornato quando cambiano le dimensioni della visualizzazione padre
Quindi conferisci la tua conoscenza. In quali situazioni raggiungi drawRect / Core Graphics (che potrebbe essere realizzato anche con le sottoview)? Quali fattori ti portano a quella decisione? Come / Perché si consiglia di disegnare in una vista personalizzata per lo scorrimento delle celle di una tabella liscia e burrosa, ma Apple sconsiglia di disegnare per motivi di prestazioni in generale? Che dire delle semplici immagini di sfondo (quando le crei con CG vs usando un'immagine png ridimensionabile)?
Potrebbe non essere necessaria una profonda comprensione di questo argomento per creare app utili, ma non amo scegliere tra le tecniche senza essere in grado di spiegare il perché. Il mio cervello si arrabbia con me.
Aggiornamento domanda
Grazie per l'informazione a tutti. Alcune domande di chiarimento qui:
- Se stai disegnando qualcosa con una grafica di base, ma puoi ottenere la stessa cosa con UIImageViews e un png pre-renderizzato, dovresti sempre seguire questa strada?
- Una domanda simile: in particolare con strumenti tosta come questo , quando dovresti considerare di disegnare elementi dell'interfaccia nella grafica principale? (Probabilmente quando la visualizzazione del tuo elemento è variabile. Ad esempio un pulsante con 20 diverse varianti di colore. Altri casi?)
- Data la mia comprensione nella mia risposta di seguito, è possibile ottenere gli stessi guadagni in termini di prestazioni per una cella di tabella catturando in modo efficace un'istantanea bitmap della cella dopo il rendering UIView complesso stesso e visualizzandola mentre si scorre e si nasconde la vista complessa? Ovviamente alcuni pezzi dovrebbero essere elaborati. Ho avuto solo un pensiero interessante.