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