2012-09-16 18 views
16

Desidero creare un'animazione CALayer che dia un effetto "appariscente". Per questo sto cercando di animare la proprietà 'opacità', ma il mio problema è che non ho idea di dove cominciare e come farlo.Animazione opacità CALayer

Ecco una spiegazione grafica dell'animazione:

opacity 
    | ___ 
1 | | | 
    | | | * repeatCount 
0 |___| |_ . . . 
    -------------------------> time 
    |______| 
    duration 

L'opacità inizia a 0, allora anima a 1, quindi nuovamente a 0 (questa animazione 0-a-1-a-0 richiede un numero di secondi uguale alla durata). Quindi questo processo viene ripetuto volte "repeatCount".

Ecco alcuni retroscena sul codice:

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc 
int repeactCount = ...; // 1, 2, 5, 6, ect 

CALayer* layer = ...; // I have a CALayer from another part of the code 
layer.opacity = 0; 

// Animation here 

done = YES; // IN THE END of the animation set this ivar to yes 

Qual è il modo migliore per ottenere questo risultato? Non ho mai usato CALayers prima, quindi questa è anche una buona opportunità per imparare come funziona il loro sistema di animazione. A proposito, ho cercato i documenti e capisco come aggiungi una o due semplici animazioni, ma non ho idea di come fare questo particolare.

+0

upvote per il grafico XD –

risposta

40

Il modo migliore per ottenere ciò è utilizzare un'animazione esplicita (vedere guide) creando un'istanza di CABasicAnimation e aggiungendola al livello.

Il codice dovrebbe essere simile a questa:

CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
flash.fromValue = [NSNumber numberWithFloat:0.0]; 
flash.toValue = [NSNumber numberWithFloat:1.0]; 
flash.duration = 1.0;  // 1 second 
flash.autoreverses = YES; // Back 
flash.repeatCount = 3;  // Or whatever 

[layer addAnimation:flash forKey:@"flashAnimation"]; 

Se vuoi sapere quando l'animazione è fatto è possibile impostare un delegato e implementare il metodo animationDidStop:finished:, tuttavia è meglio usare un blocco di completamento di quella consente a tutto il codice di trovarsi nello stesso posto. Se stai scrivendo per iOS 4 o OS X, puoi utilizzare l'eccellente categoria CAAnimationBlocks per ottenere questo risultato.

+0

Grazie! Funziona perfettamente. Solo una cosa: è 'animationWithKeyPath:' – Alex

+0

@Alex OK, aggiornerò la risposta (proveniva dalla memoria - non sempre la fonte più affidabile ...) – trojanfoe

+0

Non capisco. Si affievolisce e poi scompare immediatamente. –

0

La risposta di Trojanfoe è eccellente. Voglio solo aggiungere che se vuoi avere più controllo sulla "timeline" (quanto tempo ci vuole per svanire? Per quanto tempo dovremmo aspettare ?, quanto tempo ci vuole per svanire? E così via) sei intenzione di combinare più CABasicAnimation in un CAAnimationGroup.

Si potrebbe desiderare di leggere il mio capitolo di un libro su questo argomento, l'ultima parte dei quali costituisce un tutorial su CAAnimation e la sua prole:

http://www.apeth.com/iOSBook/ch17.html#_core_animation

Nota che la mia discussione è rivolta a iOS; su Mac OS X, se quello è il punto in cui ti trovi, l'architettura vista/livello è leggermente diversa, ma quello che dice CAAnimation è ancora corretto.