I have a CALayer
subclass with float animAngle
as property marked as @dynamic
. I have implemented methods actionForKey
, initWithLayer
, needsDisplayForKey
and drawInContext
for subclass.
The definition for actionForKey
is as follows
- (id<CAAction>)actionForKey:(NString *)event {
if([event isEqualToString:@"animAngle"]) {
return [self animationForKey:event];
}
return [super actionForKey:event];
}
And
- (CABasicAnimation *)animationForKey:(NSString *)key
{
NSString *animValue = [[self presentationLayer] valueForKey:key];// Logs as 0
CABasicAnimation *anim;
if([key isEqualToString:@"animAngle"]) {
anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
anim.repeatCount = HUGE_VAL;
anim.autoreverses = YES;
//anim.fromValue = [[self presentationLayer] valueForKey:key]; // setting animation value from layer property as in here does not work.
anim.fromValue = [NSNumber numberWithFloat:0.5f]; // This works
}
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.duration = 0.11;
return anim;
}
In Someother class:
myCASublayer.animAngle = 0.5f;
Somehow the CABasicAnimation
being returned is not able to properly use the layer "animAngle
" property.
What would i be possibly doing wrong here?
CocoaHeads Session: Rob Napier on Animating Custom Layer Properties is a good presentation about custom animations.
CALayers hate do draw ;)
If animAngle
is a @property
- you must specify accessors
for this property.
When you mark property as @dynamic
this means, that you will provide an implementation of those methods dynamically at runtime. So, if you do not provide accessors for property, you can't access it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With