2011-01-14 11 views
7

Diciamo che voglio aggiungere 50 immagini a una vista allo scopo di animarle. Supponiamo che stia pensando di utilizzare Core Animation (ad esempio, CABasicAnimation) piuttosto che l'animazione "UIView".iOS: Devo aggiungere UIViews o CALAYER per l'animazione?

Sto meglio implementando questo aggiungendo 50 subviews o 50 sottolivelli? Fa la differenza?

Grazie.

risposta

16

Come ho descritto here, ho utilizzato sia UIViews che CALayer nelle animazioni e ho trovato una differenza di prestazioni trascurabile tra di loro. Gli UIViews sono involucri molto leggeri attorno agli strati. Inoltre, qualsiasi animazione basata su livelli di cui hai bisogno può essere applicata facilmente al livello di supporto di UIView.

Ho usato CALayer direttamente in situazioni in cui volevo creare elementi dell'interfaccia utente multipiattaforma (Mac/iOS), perché i CALayer sono quasi identici nella loro implementazione su entrambe le piattaforme (a differenza delle NSViews e delle UIViews significativamente differenti). I CALayer non hanno routine di gestione del tocco fuori dalla scatola, ma è possibile aggiungere tale capacità se necessario.

Ci sono anche alcuni casi limite in cui si potrebbe voler lavorare direttamente con i livelli, come quando si tenta di eseguire una manipolazione 3-D dei livelli limitata (come in un effetto CoverFlow) o quando si utilizza CAReplicatorLayer per produrre effetti particellari.

+0

Ho finito per andare con UIViews, principalmente perché l'animazione di UIView con i blocchi è molto più facile da implementare nei casi in cui è importante eseguire animazioni/intraprendere azioni successivamente. (Questi blocchi di completamento sono molto puliti e l'utilizzo di una chiamata 'animationDidStop' delegata sarebbe stato un incubo da implementare nel mio caso particolare.) –

+1

@Greg - Sì, le nuove animazioni UIView basate su blocchi sono piuttosto pulite. Tuttavia, è possibile ottenere richiamate di completamento blocco simili con CAAnimations utilizzando '+ setCompletionBlock:' di CATransaction, che eseguirà un blocco al completamento di tutte le animazioni incluse in quella transazione. Solo qualcosa a cui pensare se si potrebbe voler andare in quel modo. –

1

Le visioni contengono sottolivelli, quindi sono più pesanti e contengono cose che probabilmente non sono necessarie per tutte le 50 immagini, come ad esempio gestori/variabili di evento e tocco. Quindi utilizzare i livelli potrebbe essere leggermente più efficiente e utilizzare un po 'meno memoria rispetto all'utilizzo di viste per ciascuna immagine.

1

La differenza per un numero così piccolo di immagini è trascurabile. Usa ciò che è più conveniente.

+0

Nella mia sperimentazione, ho scoperto che circa 50 immagini sono ciò che potevo animare prima di ottenere una balbuzie su un iPhone 4. (Posso solo presumere che questo numero varia molto a seconda del contenuto/dimensione delle immagini, numero di strati traslucidi sotto le immagini animate, ecc.) –

+0

E il modello del telefono: D – BallpointBen

0

Non ho ancora fatto animazione (-) :-), ma le cose che ricordo di aver letto su di esso suggeriscono di creare un'immagine con tutte le 50 piastrellate su di essa e quindi appena sfalsate l'immagine corretta quando si disegna. In questo modo hai solo bisogno di un layer o UIImage o altro per visualizzarlo. Non conosco la velocità, ma suppongo che salverebbe la memoria e sarebbe probabilmente più facile da gestire e codificare.

+0

Questo è generalmente definito come "sprite" e si applica alle animazioni OpenGL, ma in realtà non si applica a CoreAnimation. –