Utilizzando Core Animation, c'è un modo per raggruppare le animazioni per diversi CALayer?

StackOverflow https://stackoverflow.com/questions/418419

  •  03-07-2019
  •  | 
  •  

Domanda

Ho una situazione in cui ho molti CALayer che si animano in un "turno basato" " moda. Animo la posizione su ciascuno di quei CALayer, ma hanno la stessa identica durata. Una volta terminata l'animazione di tutti questi CALayer, un nuovo "giro" viene avviato e animano nuovamente il cambio di posizione.

L'idea generale è che con un'interpolazione lineare tra le posizioni e ad una velocità costante, una transizione a turni tra stato a stato sembra un'animazione in tempo reale. Ciò, tuttavia, è difficile da ottenere con molti CALayer diversi.

CAAnimationGroup viene utilizzato per raggruppare le animazioni su un singolo CALayer. Ma mi chiedevo, esiste una soluzione semplice per raggruppare le animazioni, che dovrebbero avere le stesse durate, su più CALayer insieme?

Modificato per includere una risposta alla domanda di Kevin Ballard

Il mio problema sta in questo. Sto creando animazioni per ciascuno dei miei CALayer, quindi inserendo quelli in un NSArray. Una volta ricevuto il callback che l'animazione individuale è terminata, la rimuovo da NSArray. Una volta che è vuoto, creo nuovamente animazioni per tutti.

Con più di alcuni livelli, c'è un notevole ritardo tra il punto in cui sono finite tutte le animazioni e quelle nuove.

Immagino che se potessi raggruppare tutte queste animazioni in una sola, molti più livelli potrebbero essere animati senza un ritardo tra le animazioni. Non rovinando così le illusioni di un'animazione contigua.

È stato utile?

Soluzione

Se si collegano animazioni a più CALayer in un unico metodo, inizieranno tutte (efficacemente) contemporaneamente. Uso questo approccio in un gioco puzzle con palle che cadono, alla fine delle animazioni allego la fase successiva dell'animazione a qualsiasi palla che necessita di ulteriore animazione.

Sto animando fino a 60 CALayer alla volta e non sto riscontrando ritardi tra le fasi dell'animazione, ma non memorizzo nella cache le animazioni in una matrice di alcun tipo, non sono sicuro del sovraccarico che hai lì .

Le mie animazioni sono relativamente semplici, create e associate a ciascun CALayer al volo. I miei sprite sono 60px quadrati e usano una dozzina di possibili immagini per rappresentare il loro contenuto.

In alcuni casi ci sono molte animazioni che posso creare con orari di inizio diversi (usando beginTime), le raggruppo con un CAAnimationGroup - ma potresti non essere in grado di precalcolare le animazioni successive.

Altri suggerimenti

Se avvolgi le tue animazioni in una CATransaction, CG si assicurerà che vengano eseguite tutte durante la stessa iterazione del ciclo principale.

[Inizio della conversione]; // tutte le tue animazioni [CATransaction commit];

Se aggiungi 3 animazioni a 3 livelli diversi contemporaneamente e hanno la stessa durata, mi aspetto che si animino tutte insieme. Che comportamento stai vedendo?

cp21yos: puoi approfondire il tuo metodo? Sto cercando di fare qualcosa di simile, che comporta l'animazione di più livelli alla volta, più di una volta. Hai detto: "alla fine delle animazioni allego la fase successiva dell'animazione". Puoi spiegarlo? Quando provo a mettere la logica per eseguire ulteriori animazioni in un evento animationDidStop, si verifica solo l'ultima animazione, anziché l'intera sequenza di animazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top