CABasicAnimation对drawInContext的调用导致实例变量重置为零

时间:2010-06-27 06:15:47

标签: iphone cocoa core-animation core-graphics

这可能是我在使用Core Animation时对调用堆栈缺乏了解,但有些事情让我对于调用drawInContext的人/什么感到困惑。

让我说我有

@interface PlayerLayer : CALayer 
{
    int Foo;
}

我在init中将Foo初始化为

-(void) init
{
  if( self = [super init] ) 
  {
    Foo = 123;
  }
}

首次调用drawInContext时,我打印出Foo

- (void)drawInContext:(CGContextRef)ctx
{
    NSLog(@"Foo: %d", Foo)
}

添加图层时第一次调用'drawInContext'并且setNeedsDisplay触发调用,Foo = 123就应该这样。

我为一个名为“Bar”的属性键设置了一个动画,其中'needsDisplayForKey'为键“Bar”返回YES。当这个动画触发'drawInContext'时,所有实例变量都设置为0,因此Foo打印为0。 “自我”指针值也发生了变化。

任何人都可以了解为什么drawInContext似乎是从其他神奇的位置调用的,而不是来自我期望它的层实例内的?

这意味着我在实例中存储的任何状态变量都不能使用: - (

1 个答案:

答案 0 :(得分:2)

在制作动画时,Core Animation会制作图层的副本并将其指定给图层的presentationLayer属性。然后在presentationLayer上执行动画。仅复制AFAIK属性,而不复制ivars。尝试将Foo声明为属性,看看是否有帮助。