Почему анимация настраиваемых свойств CALayer приводит к обнулению других свойств во время анимации?

У меня есть настраиваемый CALayer (скажем, CircleLayer), содержащий настраиваемые свойства (радиус и оттенок). Слой отрисовывается в своем методе drawInContext:

- (void)drawInContext:(CGContextRef)ctx {
    NSLog(@"Drawing layer, tint is %@, radius is %@", self.tint, self.radius);

    CGPoint centerPoint = CGPointMake(CGRectGetWidth(self.bounds)/2, CGRectGetHeight(self.bounds)/2);

    CGContextMoveToPoint(ctx, centerPoint.x, centerPoint.y);
    CGContextAddArc(ctx, centerPoint.x, centerPoint.y, [self.radius doubleValue], radians(0), radians(360), 0);
    CGContextClosePath(ctx);

    /* Filling it */
    CGContextSetFillColorWithColor(ctx, self.tint.CGColor);
    CGContextFillPath(ctx); 
}

Я хочу, чтобы радиус можно было анимировать, поэтому я реализовал

+ (BOOL)needsDisplayForKey:(NSString *)key {
    if ([key isEqualToString:@"radius"]) {
        return YES;
    }
    return [super needsDisplayForKey:key];
}

И анимация выполняется следующим образом:

CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"radius"];
theAnimation.duration=2.0;
theAnimation.fromValue=[NSNumber numberWithDouble:100.0];
theAnimation.toValue=[NSNumber numberWithDouble:50.0];
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

[circleLayer addAnimation:theAnimation forKey:@"animateRadius"];

circleLayer.radius = [NSNumber numberWithDouble:50.0];

drawInContext: вызывается, как и ожидалось, во время анимации для перерисовки круг, однако оттенок устанавливается равным нулю, как только начинается анимация, и возвращается к исходному значению, когда анимация заканчивается.

Я пришел к выводу, что если я хочу анимировать настраиваемое свойство и хочу, чтобы другие свойства сохранили их значение во время анимации, я тоже должен их анимировать, что, на мой взгляд, совсем не удобно.

Цель не в том, чтобы увеличивать / уменьшать круг, я знаю, что могу использовать для этого преобразование. Sample project illustrating the issue

There is probably something I didn't get on how CoreAnimation works, I've performed intensive searching but I'm stuck with no clue. Anyone knows?

16
задан romrom 25 October 2010 в 16:05
поделиться