2010-11-08 19 views
8

Fino ad ora sono stato in grado di animare le proprietà personalizzate della sottoclasse CALayer, grazie a + (BOOL)needsDisplayForKey:(NSString *)key e CABasicAnimations.Animare le proprietà personalizzate del CALayer all'interno di una CATransaction

Tuttavia risulta che concatenare le animazioni può diventare molto complicato perché tutto il codice si svolge in un unico metodo animationDidStop:finished:.

Quindi volevo passare a CATransactions poiché supportano la nuova sintassi del blocco, che mi consentirebbe di specificare un blocco di completamento con + (void)setCompletionBlock:(void (^)(void))block.

Ma mi sembra che lo CATransaction possa solo animare le cosiddette "proprietà animabili" e non funzioni con le mie proprietà del livello personalizzato, anche con il metodo needsDisplayForKey: implementato.

Quindi c'è un modo per rendere le proprietà personalizzate in un CALayer da animare con CATransaction?

EDIT: Il mio intento è quello di fare qualcosa sulla falsariga:

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.5]; 
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[CATransaction setCompletionBlock:^{ 
    NSLog(@"blabla"); 
}]; 

myLayer.myProperty = newValue; 

[CATransaction commit]; 

L'aggiornamento del valore di myProperty per newValue non è animato. Ho provato a implementare actionForLayer:forKey: nella vista che gestisce myLayer per restituire un CABasicAnimation. Ma actionForLayer:forKey: non viene mai chiamato con la chiave myProperty. E sì, myLayer non è view.layer ma un sottolivello, e sì ho impostato il delegato di myLayer nella vista contenente.

risposta

10

Credo, in base alla lettura di alcuni codici sorgente, che è ancora possibile utilizzare uno CABasicAnimation all'interno dello CATransaction. Qualsiasi CAAnimations aggiunto tra [CATransaction begin] e [CATransaction commit] dovrebbe essere una parte della transazione.

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.5]; 
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[CATransaction setCompletionBlock:^{ 
    NSLog(@"blabla"); 
}]; 

// Create the CABasicAnimation using your existing code 
CABasicAnimation *myPropertyAnim = [CABasicAnimation animationWithKeyPath:@"myProperty"]; 
// TODO: Setup animation range 
myPropertyAnim.toValue = newValue; 

// The CATransaction does not observe arbitrary properties so this fails: 
//myLayer.myProperty = newValue; 

// Add the CAAnimation subclass during the CATransaction 
[myLayer addAnimation:myPropertyAnim forKey:@"myKey"]; 

[CATransaction commit]; 

Scuse che non ho una messa a punto del progetto di testare facilmente questo ora, ma credo che funzionerà.

controllare questi sito per il codice:

codice che ho fatto riferimento:

[CATransaction begin]; 
[topLayer addAnimation:topAnimation forKey:@"flip"]; 
[bottomLayer addAnimation:bottomAnimation forKey:@"flip"]; 
[CATransaction commit]; 
+0

Confermo che funziona però mi sento un po 'deluso dal fatto che non è possibile avere la stessa magia dietro proprietà personalizzate rispetto alle proprietà animatable. E ho intenzione di eseguire alcuni test per vedere cosa succede se la durata della CATransaction è impostata su un valore inferiore rispetto a nessuno dei link CAAnimations – romrom

1

C'è una grande classe chiamata CAAnimationBlocks, e ha spiegato here , questo è un gatto egory su CAAnimation che ti consente di utilizzare blocchi di completamento come faresti su un UIView.

Si usa semplicemente chiamando:

CABasicAnimation myAnimation; 
[myAnimation setCompletion:^(BOOL finished) { // Do something }]; 
+0

non esiste – Leena

Problemi correlati