这可能是我在使用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似乎是从其他神奇的位置调用的,而不是来自我期望它的层实例内的?
这意味着我在实例中存储的任何状态变量都不能使用: - (
答案 0 :(得分:2)
在制作动画时,Core Animation会制作图层的副本并将其指定给图层的presentationLayer
属性。然后在presentationLayer上执行动画。仅复制AFAIK属性,而不复制ivars。尝试将Foo
声明为属性,看看是否有帮助。