根据path属性为CAShapeLayer的子类自定义属性设置动画

我有一个CAShapeLayer子类,它有两个属性,一个startPoint和一个endPoint。 这些属性不会直接绘制到上下文中,而是用于更改path属性,类似于transform,position和bounds属性。

这是整个图层的代码

-(void)setStartPoint:(CGPoint)startPoint { if (!CGPointEqualToPoint(_startPoint, startPoint)) { _startPoint = startPoint; [self reloadPath]; } } -(void)setEndPoint:(CGPoint)endPoint { if (!CGPointEqualToPoint(_endPoint, endPoint)) { _endPoint = endPoint; [self reloadPath]; } } -(id)initWithLayer:(CRPathLayer*)layer { self = [super initWithLayer:layer]; if (self && [layer isKindOfClass:[CRPathLayer class]]) { self.startPoint = layer.startPoint; self.endPoint = layer.endPoint; } return self; } +(BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:NSStringFromSelector(@selector(startPoint))] || [key isEqualToString:NSStringFromSelector(@selector(endPoint))]) { return YES; } return [super needsDisplayForKey:key]; } -(void)reloadPath { CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, self.startPoint.x, self.startPoint.y); CGPathAddLineToPoint(path, NULL, self.endPoint.x, self.endPoint.y); self.path = path; CGPathRelease(path); } 

然而,这是一个问题。 我需要为两个新属性(start-或endPoint)中的一个设置动画。 我知道我可以直接为path属性设置动画,但这不是我想要实现的。 我显然在实现中遗漏了一些东西。 当我尝试使用CABasicAnimation为它设置动画时,根本没有任何事情发生。

有人可以帮帮我吗? 提前致谢。

你缺少的部分是actionForKey:方法(虽然path是可动画的,但它不是隐式可动画的(即它不会因为属性改变而动画))。

您需要做的是在startPoint或endPoint发生更改时为路径提供动作(动画的更通用术语)(或者只是使路径可隐式动画,以便设置新路径导致动画,他们真的做了一样)。

它可能看起来像这样(我在浏览器中键入它,因此它可能无法编译):

 - (id )actionForKey:(NSString *)key { if ([key isEqualToString:@"startPoint"] || [key isEqualToString:@"endPoint")]) { CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"path"]; anim.fromValue = [self.presentationLayer valueFoKey:@"path"]; return animo; } return [super valueForKey:key]; }