Hi, I have a layer where I want to animate a point, testPoint. For the moment, I want to animate the y value of the point. I have testPoint as a property of the layer. I want to get it to redisplay (and preferably also call the setTestPoint) on every frame of the animation, so I implement:
+ (BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"testPoint"]) { return YES; } return [super needsDisplayForKey:key]; } To see the changes as they are made, in addition to the normal synthesize of the testPoint, I have implemented the setter as follows: - (void)setTestPoint:(CGPoint)p { NSLog(@"Setting test point to %f, %f", p.x, p.y); [self willChangeValueForKey:@"testPoint"]; testPoint = p; [self didChangeValueForKey:@"testPoint"]; } When I create the layer, I initialize the testPoint as follows: layer.testPoint = CGPointMake(5.0f, 10.0f); I try to animate the move of the point using: CABasicAnimation *movePointAnimation = [CABasicAnimation animation]; movePointAnimation.keyPath = @"testPoint.y"; movePointAnimation.toValue = [NSNumber numberWithFloat:y]; movePointAnimation.duration = 5.0f; movePointAnimation.removedOnCompletion = YES; movePointAnimation.fillMode = kCAFillModeBoth; movePointAnimation.repeatCount = 0; movePointAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [layer addAnimation:movePointAnimation forKey:@"testPoint.y"]; What I expected to happen is that I would get a bunch of calls to setTestPoint:, passing in the original x value of 5.0 and animating from the previous y point (initially 10.0) to the new point, and that my drawLayer:inContext: would have been called for each iteration. Here's a typical run (each call to the animation separated by a line gap): 2010-09-21 08:16:36.717 CADisplay[20048:a0f] Starting animation to 4383.000000 2010-09-21 08:16:48.422 CADisplay[20048:a0f] Starting animation to 886.000000 2010-09-21 08:16:48.424 CADisplay[20048:a0f] Setting test point to 0.000000, 0.041937 2010-09-21 08:16:48.424 CADisplay[20048:a0f] Setting test point to 0.000000, 0.042831 2010-09-21 08:16:48.425 CADisplay[20048:a0f] Setting test point to 0.000000, 0.044800 2010-09-21 08:16:48.445 CADisplay[20048:a0f] Setting test point to 0.000000, 0.140321 2010-09-21 08:16:48.456 CADisplay[20048:a0f] Setting test point to 0.000000, 0.215275 2010-09-21 08:17:01.422 CADisplay[20048:a0f] Setting test point to 0.000000, 886.000000 2010-09-21 08:17:01.583 CADisplay[20048:a0f] Starting animation to 2777.000000 2010-09-21 08:17:15.142 CADisplay[20048:a0f] Starting animation to 1915.000000 2010-09-21 08:17:15.143 CADisplay[20048:a0f] Setting test point to 0.000000, 0.090642 2010-09-21 08:17:15.144 CADisplay[20048:a0f] Setting test point to 0.000000, 0.092054 2010-09-21 08:17:15.144 CADisplay[20048:a0f] Setting test point to 0.000000, 0.095602 2010-09-21 08:17:15.160 CADisplay[20048:a0f] Setting test point to 0.000000, 0.247579 2010-09-21 08:17:15.175 CADisplay[20048:a0f] Setting test point to 0.000000, 0.464084 And when I clicked on XCode, it added: 2010-09-21 08:17:26.118 CADisplay[20048:a0f] Setting test point to 0.000000, 1915.000000 ...and my drawLayer:inContext: was not called at all during the animation. What am I missing here? Why is my layer not being drawn on every frame? Why is the setTestPoint getting called with a zero X value? Why am I just getting these strange values in setTestPoint, and why for only the first tiny bit of the animation? Also, if I wanted to animate the whole point rather than just the y value, what should I pass in? I don't see an NSValue valueWithCGPoint... Thanks in advance Ken_______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com