En una subclase CALayer estoy trabajando en que tienen una propiedad personalizada que quiero animar de forma automática, es decir, suponiendo que la propiedad se llama "myProperty", quiero el siguiente código:Animación de propiedades personalizadas con actionForKey: ¿cómo obtengo el nuevo valor para la propiedad?
[myLayer setMyProperty:newValue];
Para causar una animación suave desde el valor actual hasta "newValue".
Utilizando el enfoque de reemplazar la acciónForKey: y needsDisplayForKey: (ver el siguiente código) Pude hacer que funcionara muy bien para simplemente interpolar entre el valor antiguo y el nuevo.
Mi problema es que quiero utilizar una duración de la animación o una ruta ligeramente diferente (o lo que sea) dependiendo del valor actual y el nuevo valor de la propiedad y no pude averiguar cómo obtener la nueva valor desde dentro actionForKey:
Gracias de antemano
@interface ERAnimatablePropertyLayer : CALayer {
float myProperty;
}
@property (nonatomic, assign) float myProperty;
@end
@implementation ERAnimatablePropertyLayer
@dynamic myProperty;
- (void)drawInContext:(CGContextRef)ctx {
... some custom drawing code based on "myProperty"
}
- (id <CAAction>)actionForKey:(NSString *)key {
if ([key isEqualToString:@"myProperty"]) {
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:key];
theAnimation.fromValue = [[self presentationLayer] valueForKey:key];
... I want to do something special here, depending on both from and to values...
return theAnimation;
}
return [super actionForKey:key];
}
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqualToString:@"myProperty"])
return YES;
return [super needsDisplayForKey:key];
}
@end
La implementación de un descriptor de acceso para la propiedad @dynamic (myProperty) hace que toda la magia desaparezca: CA simplemente deja de iniciar transacciones implícitas para la propiedad. – zrxq
Vale la pena saberlo, pero dado que el OP quiere una animación explícita, diría que no es un problema. – Simon
OP quiere uno implícito. "Tengo una propiedad personalizada que quiero animar automáticamente". Además, myProperty es @dynamic en el fragmento original. – zrxq