gpt4 book ai didi

iphone - 为什么对自定义 CALayer 属性进行动画处理会导致其他属性在动画过程中为零?

转载 作者:行者123 更新时间:2023-12-03 18:22:40 25 4
gpt4 key购买 nike

我有一个自定义 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

可能有一些我不明白 CoreAnimation 是如何工作的,我已经进行了深入的搜索,但我没有任何线索。有人知道吗?

最佳答案

如果我正确理解你的问题,事情是这样的。当您将动画添加到 CALayer 时,它会使用 initWithLayer: 创建该层的所谓演示副本。表示层包含每个动画帧的实际动画状态,而原始层具有最终状态。对自己的属性进行动画处理的问题是 CALayer 不会将它们全部复制到 initWithLayer: 中。如果是这种情况,您应该重写 initWithLayer: 并设置动画所需的所有属性,即色调和半径。

关于iphone - 为什么对自定义 CALayer 属性进行动画处理会导致其他属性在动画过程中为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4016496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com