CATransaction没有观察到CALayer子类的属性

Dfo*_*owj 3 iphone core-animation key-value-coding ios

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

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

我想在显式内部对此属性进行动画处理CATranasction,因此我使用actionForLayer:forKey:实现的方法设置一个委托,该方法返回一个动画,但是对someMyLayerInstance.customValue内部的任何更改[CATransaction begin] ... [CATransaction end]都不会导致actionForLayer:forKey使用相应的"key"值进行调用.

然而,通过调用MyLayer来修改属性并进行更改导致调用.myLayerInstancesetValue:forKey: actionForLayer:forKey:

看起来这是因为CALayer对于未定义属性的键/值编码有一些mojo.我如何重新创建这个mojo以便我可以声明属性MyLayer,但仍然可以让动画委托观察它们?

Rob*_*ier 7

最重要的是您需要使用实现所有CALayer访问器@dynamic.不要直接使用@synthesize也不要实现访问者.CALayer生成所有自己的属性处理程序(正如你间接发现的那样),你需要让它们被使用.

您还需要CALayer知道此属性对显示有影响(您可能已经根据其他注释执行了此操作).如果还没有,可以通过实现+needsDisplayForKey:并返回YES密钥来实现.

这是一个CALayer动画自定义属性的示例(取自iOS 5编程推动限制的第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
Run Code Online (Sandbox Code Playgroud)