2013-04-22 8 views
5

Sto animando un CALayer utilizzando CABasicAnimation e mi aspetto che il livello rimanga in posizione al termine dell'animazione. Quasi tutte le soluzioni mostrano la seguente, che funziona beneModo corretto per prevenire la scomparsa del livello in CABasicAnimation?

animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

Tuttavia, il WWDC altoparlante nel Core Animation in Pratica Parte 1 2010 (~ 38-41mins) dice che la maggior parte delle soluzioni per lo strato di scomparsa trovato sono " falsa" e il modo corretto per animare un livello è approssimativamente le seguenti

animation.fromValue = [NSNumber numberWithFloat:layer.position.y]; 
layer.position = CGPointMake(layer.position.y, endPoint); 
animation.toValue = [NSNumber numberWithFloat:endPoint]; 

il motivo è che la soluzione removedOnCompletion/FillMode blocca solo il livello di presentazione, e lo strato attuale ha ancora il suo set posizione originale.

Per favore correggimi se ho mal interpretato l'oratore.

Se l'ho capito correttamente, quando importa?

Grazie, Steve

risposta

2

Dipende da cosa vuoi fare ... La tua spiegazione sembra abbastanza chiara.

Se si animano solo le proprietà senza modificare il valore effettivo, "ciò che si vede" è in realtà diverso da "ciò che è". La maggior parte delle volte non lo vuoi (E quando si usano le animazioni UIView o le animazioni implicite CALayer, "ciò che è" e "ciò che si vede" sono sincronizzati, il che è coerente con la sintassi del setter diretto).

Ma in alcuni casi, può essere utile conservare il valore effettivo e mostrare temporaneamente qualcosa di diverso sullo schermo ... purché tu sappia cosa stai facendo!

+0

Grazie per la risposta - scusate il mio era un po 'lento. Forse non ho mai incontrato la necessità di fare qualcosa di più con il livello di presentazione o il livello attuale ed è per questo che ho lottato con i due metodi. Grazie ancora. Steve – Steve

1

Hai capito bene.

Significa che quando si esegue un'animazione su un livello viene creato un livello "speciale" chiamato "livello presentazione" e l'animazione è effettivamente avvenuta su di esso, ma il livello effettivo non viene modificato. In effetti, è necessario impostare la proprietà sul layer alla fine dell'animazione per "sincronizzare" il livello con lo stato di animazione finale.

Problemi correlati