Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CAAnimation和CALayer变换的问题_Iphone_Uikit_Core Animation_Calayer_Caanimation - Fatal编程技术网

Iphone CAAnimation和CALayer变换的问题

Iphone CAAnimation和CALayer变换的问题,iphone,uikit,core-animation,calayer,caanimation,Iphone,Uikit,Core Animation,Calayer,Caanimation,我有一个CALayer,我想在屏幕上设置动画。我创建了两种方法:一种是滑动打开图层,另一种是滑动关闭图层。这两种方法都是通过将特性指定给图层的变换特性来实现的 现在我想使用一个CAKeyFrameAnimation来滑动打开该层。我这样做是为了让图层滑开,但现在我不能用我的老方法滑合图层。我想弄明白这是为什么。任何帮助都会很好 my CALayer的代码: - (id)init { if( self = [super init] ) { bIsOpen = NO; clo

我有一个CALayer,我想在屏幕上设置动画。我创建了两种方法:一种是滑动打开图层,另一种是滑动关闭图层。这两种方法都是通过将特性指定给图层的变换特性来实现的

现在我想使用一个CAKeyFrameAnimation来滑动打开该层。我这样做是为了让图层滑开,但现在我不能用我的老方法滑合图层。我想弄明白这是为什么。任何帮助都会很好

my 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;
  }
}

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