0

画面全体でアニメーション化したい CALayer があります。2 つの方法を作成しました。1 つはスライドでレイヤーを開き、もう 1 つはスライドで閉じます。これらは両方とも、レイヤーの変換プロパティにプロパティを割り当てることによって機能します。

ここで、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 に答える