- (void)createArcAnimationForKey:(NSString *)key fromValue:(NSNumber *)from toValue:(NSNumber *)to Delegate:(id)delegate
{
CABasicAnimation *arcAnimation = [CABasicAnimation animationWithKeyPath:key];
NSNumber *currentAngle = [[self presentationLayer] valueForKey:key];
if(!currentAngle) currentAngle = from;
[arcAnimation setFromValue:currentAngle];
[arcAnimation setToValue:to];
[arcAnimation setDelegate:delegate];
[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
[self addAnimation:arcAnimation forKey:key];
[self setValue:to forKey:key];
}
- (void)updateTimerFired:(NSTimer *)timer;
{
CALayer *parentLayer = [_pieView layer];
NSArray *pieLayers = [parentLayer sublayers];
[pieLayers enumerateObjectsUsingBlock:^(CAShapeLayer * obj, NSUInteger idx, BOOL *stop) {
NSNumber *presentationLayerStartAngle = [[obj presentationLayer] valueForKey:@"startAngle"];
CGFloat interpolatedStartAngle = [presentationLayerStartAngle doubleValue];
NSNumber *presentationLayerEndAngle = [[obj presentationLayer] valueForKey:@"endAngle"];
CGFloat interpolatedEndAngle = [presentationLayerEndAngle doubleValue];
CGPathRef path = CGPathCreateArc(_pieCenter, _pieRadius, interpolatedStartAngle, interpolatedEndAngle);
[obj setPath:path];
CFRelease(path);
{
CALayer *labelLayer = [[obj sublayers] objectAtIndex:0];
CGFloat interpolatedMidAngle = (interpolatedEndAngle + interpolatedStartAngle) / 2;
[CATransaction setDisableActions:YES];
[labelLayer setPosition:CGPointMake(_pieCenter.x + (_labelRadius * cos(interpolatedMidAngle)), _pieCenter.y + (_labelRadius * sin(interpolatedMidAngle)))];
[CATransaction setDisableActions:NO];
}
}];
}
- (void)animationDidStart:(CAAnimation *)anim
{
if (_animationTimer == nil) {
static float timeInterval = 1.0/60.0;
// Run the animation timer on the main thread.
// We want to allow the user to interact with the UI while this timer is running.
// If we run it on this thread, the timer will be halted while the user is touching the screen (that's why the chart was disappearing in our collection view).
_animationTimer= [NSTimer timerWithTimeInterval:timeInterval target:self selector:@selector(updateTimerFired:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_animationTimer forMode:NSRunLoopCommonModes];
}
[_animations addObject:anim];
}