2013-09-24 10 views
5

Se creo una sottoclasse UIView e si desidera utilizzare un mucchio di contenuti su misura (animazioni tramite CABasicAnimation utilizzando CAShapeLayer s, disegni su misura utilizzando CGContextRef in drawRect) quando è il momento giusto per creare, aggiungere e animare i sottolivelli?Quando è il momento giusto per animare e aggiungere sottolivelli in una sottoclasse UIView

So che dovrei eseguire disegni personalizzati nel metodo drawRect (e poiché c'è l'unico posto in cui posso effettivamente ottenere UIGraphicsGetCurrentContext() che restringe leggermente la mia scelta verso il basso). Ora ho creato sottolivelli, animazioni e tutte le altre cose correlate non di disegno nello drawRect. Ma non sono sicuro che lo drawRect sia il posto migliore per fare questo tipo di attività.

Ho familiarità con il metodo layoutSubviews e alcuni altri metodi UIView ma in realtà non ne ho implementato nessuno eccetto lo drawRect.

Quindi, se mi ripeto ancora una volta, la domanda è: dove aggiungere i sottolivelli, dove animarli e quali sono i trucchi o le catture di cui dovrei essere a conoscenza?

risposta

7
  1. È possibile creare e aggiungere i livelli in init, se sono permanenti. Se sono dinamici, layoutSubviews è migliore. Ciò significa ovviamente che è necessario impostare il valore di default ogni volta che è necessario un nuovo livello/elemento. Puoi mescolare e abbinare quanto vuoi tra -init e -layoutSubview, ma se dovessi scegliere, direi magra verso l'uso di layoutSubviews. Non usare drawRect.

  2. È possibile impostare proprietà (larghezza del tratto, lineaColore, percorso, ecc.) Su un CAShapeLayer al momento della creazione o durante l'esecuzione normale. Ciò include l'impostazione di un percorso per CAShapeLayer. Ancora una volta, non impostare le proprietà in drawRect.

  3. Se si desidera eseguire un disegno personalizzato sul livello, è possibile creare una sottoclasse di livello e utilizzare drawRect su tale livello. Questo può essere utile se i CALAyers devono essere riutilizzati ed estesi. Puoi anche fornire un CALayerDelegate, purché non sia l'UIView. Vedere queste domande: Using CALayer DelegateE iOS: Using UIView's 'drawRect:' vs. its layer's delagate 'drawLayer:inContext:'

  4. animazione è semplice, e segue gli stessi principi come la creazione e impostazione delle proprietà. Assicurarsi di aver compreso quando le animazioni automatiche saranno invocati e come disabilitarli: Disabling implicit animations in -[CALayer setNeedsDisplayInRect:] Anche in questo caso non si tenta di animare da drawRect: How to make my UIBezierPath animated with CAShapeLayer?

  5. disegno è costoso. L'animazione è economica. L'uso eccessivo di drawRect causerà un grande impatto sulle prestazioni delle tue applicazioni. Usa drawRect/setNeedsDisplay con parsimonia, ad esempio su un cambio di stato (selezionato/non selezionato). Quando possibile, modificare le viste con animazioni o proprietà di livello superiore e non ridisegnare la vista. Fare drawRect fa qualcosa DIVERSO da draw potrebbe causare la chiamata inutilmente setNeedsDisplay. Una semplice ottimizzazione anticipata è di chiamare drawRect il meno possibile, o per niente.

+0

Grazie. Perché non è consigliabile animare da drawRect? – Majster

+0

Manca quel punto, ed è un grosso problema. Modificato la mia risposta. – Saltymule