2010-06-27 29 views
2

這可能是我在使用Core Animation時對調用堆棧的理解不夠,但有些事情讓我對調用drawInContext的人/什麼感到困惑。CABasicAnimation對drawInContext的調用導致實例變量重置爲零

可以說我有

@interface PlayerLayer : CALayer 
{ 
    int Foo; 
} 

,我初始化美孚在init進程是這樣​​的

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

當drawInContext首次調用,打印出富

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

的第一次'drawInContext'在圖層被添加並且setNeedsDisplay觸發該調用時被調用,Foo = 123因爲它應該。

例如,我有一個名爲「Bar」的屬性鍵設置動畫,其中'needsDisplayForKey'爲鍵「Bar」返回YES。當這個動畫觸發'drawInContext'時,所有的實例變量都被設置爲0,並且這樣Foo輸出爲0. 'self'指針值已經改變。

任何人都可以照亮爲什麼drawInContext似乎是從其他一些神奇的位置調用的,而不是從我期望它的圖層的實例中調用?

這意味着我已經存儲在實例中的任何狀態變量不能:-(

回答

1

被用來在做動畫,核心動畫使層的副本,並指派的它的層的presentationLayer財產。該動畫然後在presentationLayer上執行AFAIK only屬性被複制,而不是ivars。嘗試聲明Foo作爲一個屬性,看看是否有幫助

+0

謝謝奧萊,我認爲可能是這樣,所以我給了它一個去。 您是否知道在文檔中我可能會發現有關複製過程的信息? 或者,您是否有ide關於如何從動畫中訪問這些數據? – Fuzz 2010-06-27 10:18:06

+1

你是對的Ole,除了屬性似乎不會被自動複製。相反,用戶可以覆蓋initWithLayer並強制自定義屬性被複制。 參見: http://stackoverflow.com/questions/2797103/how-is-the-presentation-layer-of-a-calayer-generated – Fuzz 2010-06-27 10:36:15