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.
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