Вызов CABasicAnimation для drawInContext заставляет переменные экземпляра сбрасываться в ноль - PullRequest
2 голосов
/ 27 июня 2010

Это может быть мое непонимание стека вызовов при использовании Core Animation, но что-то меня немного смущает, кто / что вызывает drawInContext.

Допустим, у меня есть

@interface PlayerLayer : CALayer 
{
    int Foo;
}

и я инициализирую Foo в init как что-то вроде

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

Когда вызывается drawInContext, я распечатываю Foo

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

Первый раз, когда вызывается drawInContext, когдадобавляется слой, и setNeedsDisplay запускает вызов, Foo = 123, как и должно быть.

У меня настроена анимация, например, для ключа свойства, называемого «Bar», в котором «needsDisplayForKey» возвращает YES для ключа »Бар".Когда эта анимация запускает «drawInContext», все переменные экземпляра устанавливаются в 0, и поэтому Foo печатает как 0. Также изменилось значение указателя «self».

Может ли кто-нибудь пролить свет на то, почему drawInContext кажетсябыть вызванным из какого-то другого магического места, а не из экземпляра слоя, который, как я ожидаю, будет?

Это означает, что любые переменные состояния, которые я сохранил в экземпляре, не могут быть использованы :-(

1 Ответ

2 голосов
/ 27 июня 2010

При создании анимации Core Animation делает копию слоя и присваивает ее свойству presentationLayer слоя.Затем анимация выполняется на уровне представления.AFAIK копируются только свойства, а не ivars.Попробуйте объявить Foo как свойство и посмотрите, поможет ли это.

...