0

我有一个想要在屏幕上设置动画的 CALayer。我创建了两种方法:一种滑动打开图层,另一种滑动关闭。这些都通过将属性分配给图层的变换属性来工作。

现在我想使用 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;
  }
}
4

1 回答 1

0

我想通了。我的问题是动画使对象动画化,就好像它修改了已更改的属性(在本例中为 transform ),但该值实际上并未更改。我相信这与表示层与模型层有关。因此,当打开图层的动画完成时,图层正确定位在屏幕上,但它的变换实际上并没有改变。因此,为了解决这个问题,我使用(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag委托方法在动画完成后将变换设置为打开状态。

于 2010-04-15T14:50:08.983 回答