Проблема с CAAnimation и CALayer Transforms - PullRequest
0 голосов
/ 15 апреля 2010

У меня есть CALayer, который я хочу анимировать по экрану. Я создал два метода: один слайд, чтобы открыть слой и один, чтобы скользить близко. Оба они работают, назначая свойство свойству transform слоя.

Теперь я хочу использовать CAKeyFrameAnimation, чтобы открыть слой. У меня получилось, что слой открылся, но теперь я не могу закрыть слой, используя мой старый метод. Я пытаюсь понять, почему это так. Любая помощь будет великолепна.

Код для моего CALayer:

- (id)init
{
  if( self = [super init] )
  {
    bIsOpen = NO;
    closeTransform = self.transform;
    openTransform = CATransform3DMakeTranslation(-235.0, 0.0, 0.0);
  }
  return self;
}

- (void)closeMenu
{
  if( bIsOpen )
  {
    self.transform = closeTransform;
    bIsOpen = !bIsOpen;
  }  
}

- (void)openMenu
{
  if( !bIsOpen )
  {
    CAKeyframeAnimation *closeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    closeAnimation.duration = 1.0;
    closeAnimation.removedOnCompletion = NO;
    closeAnimation.fillMode = kCAFillModeForwards;
    closeAnimation.values = [NSArray arrayWithObjects:[NSValue valueWithCATransform3D:closeTransform],[NSValue valueWithCATransform3D:openTransform],nil];
    closeAnimation.timingFunctions = [NSArray arrayWithObject:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

    [self addAnimation:closeAnimation forKey:@"transform"];
    bIsOpen = !bIsOpen;
  }
}

1 Ответ

0 голосов
/ 15 апреля 2010

Я понял это.Моя проблема заключалась в том, что анимация анимирует объект, как если бы он изменял изменяемое свойство (в данном случае преобразование), но значение фактически не изменялось.Я считаю, что это связано с уровнем представления данных по сравнению с уровнем модели.Поэтому, когда анимация была открыта для открытия слоя, слой был правильно расположен на экране, но его преобразование фактически не изменилось.Поэтому, чтобы исправить это, я использовал метод делегата (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag, чтобы установить преобразование в открытое состояние после завершения анимации.

...