2009-07-16 11 views
72

Sono alle prese con concettualizzare le animazioni con un CALayer in contrasto con i metodi di animazione propri di UIView. Lancia "Core Animation" in questo e, beh, forse qualcuno può articolare questi concetti da un livello elevato in modo da poter visualizzare meglio cosa sta succedendo e perché vorrei migrare le animazioni di UIView (che ora conosco abbastanza bene) alle animazioni CALayer su iPhone. Ogni vista in Cocoa-Touch ottiene automaticamente un livello. E, a quanto pare, è possibile animare uno e/o l'altro?!? Anche mescolarli insieme?!? Ma perché? Dov'è la linea? Qual è il pro/contro a ciascuno?Animazione UIView vs CALayers

La Guida di programmazione Core Animation salta immediatamente al livello & Classi di cronometraggio e ritengo necessario fare un passo indietro e capire perché questi vari pezzi esistono e come si relazionano tra loro.

+3

Questa era una domanda eccellente e di uso generale e tutte le risposte sono eccellenti. Ho votato tutti su questo thread. – mobibob

+0

Ottima domanda. Qualcuno conosce le migliori pratiche per l'animazione di un CALayer di UIView?Nel mio esempio ho bisogno di un effetto 3D, e trovo che animare il livello faccia in modo che il "fotogramma" di UIView sia disallineato con il livello (quindi per un pulsante, i tocchi non corrispondono più). – Marc

risposta

53

Utilizzare le visualizzazioni per il controllo e gli strati per i dolci per gli occhi. I livelli non ricevono eventi quindi è più facile usare una vista per quei casi, ma quando si desidera animare uno sprite o sfondi, ecc., I livelli hanno senso. Gli eventi passano attraverso i livelli fino alla vista di supporto in modo da avere una bella rappresentazione visiva senza rovinare i tuoi eventi. Prova a sovrapporre una vista che stai usando per la rappresentazione visiva e dovrai passare tu stesso gli eventi tap alla vista sottostante.

+1

Questo mi ha aiutato, grazie :) – Spanky

+0

Questa è un'ottima risposta. Grazie! – Warpling

9

Le trasformazioni di UIView sono solo 2D e sono limitate a questo, le trasformate di LAyer tuttavia possono essere 3D e dovresti usarle se vuoi fare cose 3D, l'animazione di UIView funzionerà se cambi la trasformazione di UIView o la trasformazione di CALayer. Quindi a livello di base, puoi fare molta più manipolazione quando lavori con un Layer piuttosto che con la Vista.

24

Un UIView viene sempre visualizzato in un CALayer. Quando si utilizzano i metodi UIView per animare una vista, si sta effettivamente manipolando il sottostante CALayer.

Se è necessario eseguire operazioni semplici, utilizzare i metodi UIView. Per situazioni più complesse o se si desidera creare layer non associati a nessuna vista in particolare, utilizzare CALayers.

20

Ho fatto un sacco di app l'anno scorso. Ecco la mia regola generale:

  1. Utilizzare UIView finché non esegue ciò che si desidera.
  2. Quindi passare a CoreAnimation. Ma prima di addentrarti troppo ...
  3. Se scrivi più di poche animazioni, usa Cocos2D.
+0

Cosa sta facendo meglio Cocos2D? Non hai altri problemi allora, per quanto riguarda la gestione degli eventi touch e molte altre cose che mancano in openGL ES? – Thanks

+0

Cocos2D aggiunge molti metodi di convenienza, quindi il codice è molto più compatto. Hanno alcuni grandi effetti incorporati. In poche parole, se stai facendo un po 'di animazione, scrivi meno codice di OpenGL ES o Core Animation se usi Cocos2D. Hanno i loro metodi di gestione del tocco, quindi non è un problema. –

+13

Il mio suggerimento non è quello di utilizzare Cocos2D a meno che non si stia scrivendo un gioco. Penso che sia davvero il suo caso d'uso migliore. Sono d'accordo, però, che dovresti usare le animazioni di UIView per tutto il tempo che puoi, e per qualsiasi cosa al di là di ciò usi CoreAnimation. –

2

Non sono sicuro di aver frainteso la risposta di Chris a "Cosa sta facendo Cocos2D meglio? Non hai altri problemi allora, per quanto riguarda la gestione degli eventi touch e molte altre cose che mancano in openGL ES?"

Sembra che la risposta suggerisca che Cocos2D non si basa sul framework OpenGL ES quando in realtà lo è. Sebbene sia un ottimo motore di gioco 2D, implementa OpenGL per gran parte del suo rendering - collegato a una libreria fisica consente molte possibilità molto interessanti per l'animazione - e Chris è corretto - è molto meno codificante.