CAT交易没有观察到CALayer子类的属性

我有一个自定义属性的CALayer的子类,声明如下:

 @interface MyLayer : CALayer @property (nonatomic,retain) NSNumber *customValue; @end @implementation MyLayer @synthesize customValue = _customValue; @end 

我想在一个明确的CATranasction里面设置这个属性的animation,所以我使用actionForLayer:forKey:方法设置了一个委托,它返回一个animation,然而[CATransaction begin] ... [CATransaction end]里面[CATransaction begin] ... [CATransaction end]任何改变[CATransaction begin] ... [CATransaction end]不会导致actionForLayer:forKey使用相应的“键”值进行调用。

但是,通过调用setValue:forKey:调整myLayerInstance上的属性并更改myLayerInstance setValue:forKey: 导致actionForLayer:forKey:正在调用。

看起来这是因为CALayer为未定义属性的键/值编码做了一些mojo。 我如何重新创build这个mojo,以便我可以在MyLayer上声明属性,但是仍然让它们被animation代理人观察到?

最重要的是你需要使用@dynamic来实现所有的CALayer访问器。 不要使用@synthesize ,也不要直接实现访问器。 CALayer生成所有的属性处理程序(就像你间接发现的那样),你需要让这些处理程序被使用。

您还需要让CALayer知道这个属性是影响显示效果(您可能已经完成了其他评论)。 如果没有,则通过实现+needsDisplayForKey:并为您的密钥返回YES来执行此操作。

下面是一个animation定制属性的CALayer示例(摘自iOS 5 Programming Pushing the Limits的第7章,完整的示例代码可以在Wiley站点上获得)。这个示例在图层中实现了actionForKey:但是仍然可以实现如果你愿意的话,可以在代表那一部分。

 @implementation CircleLayer @dynamic radius; ... + (BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"radius"]) { return YES; } return [super needsDisplayForKey:key]; } - (id < CAAction >)actionForKey:(NSString *)key { if ([self presentationLayer] != nil) { if ([key isEqualToString:@"radius"]) { CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"radius"]; anim.fromValue = [[self presentationLayer] valueForKey:@"radius"]; return anim; } } return [super actionForKey:key]; } @end