Warum führt das Animieren von benutzerdefinierten CALayer-Eigenschaften dazu, dass andere Eigenschaften während der Animation gleich Null sind?

Ich habe einen benutzerdefinierten CALayer (z. B. CircleLayer), der benutzerdefinierte Eigenschaften (Radius und Farbton) enthält. Die Ebene wird in ihrer drawInContext: -Methode gerendert.

- (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); 
}

Ich möchte, dass der Radius animierbar ist, also habe ich @ implementier

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

Und die Animation wird folgendermaßen ausgeführt:

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: wird wie erwartet während der Animation aufgerufen, um den Kreis neu zu zeichnen. Der Farbton wird jedoch auf Null gesetzt, sobald die Animation beginnt, und wird auf den ursprünglichen Wert zurückgesetzt, wenn die Animation endet.

Ich bin zu dem Schluss gekommen, dass wenn ich eine benutzerdefinierte Eigenschaft animieren möchte und andere Eigenschaften ihren Wert während der Animation behalten sollen, ich sie auch animieren muss, was mir überhaupt nicht zusagt.

Der Zweck ist nicht, einen Kreis zu vergrößern / zu verkleinern. Ich weiß, dass ich dafür Transformation verwenden kann. Es soll nur anhand eines einfachen Beispiels das Problem der Animation einer einzelnen benutzerdefinierten Eigenschaft veranschaulicht werden, ohne dass alle anderen animiert werden müssen.

Ich habe ein einfaches Projekt erstellt, das das Problem veranschaulicht. Sie finden es hier:Beispielprojekt zur Veranschaulichung des Problems

Es gibt wahrscheinlich etwas, das ich nicht verstanden habe, wie CoreAnimation funktioniert. Ich habe intensiv gesucht, bin aber ohne Ahnung geblieben. Weiß jemand Bescheid?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage