0

UIViewのdrawRectメソッドでパスを描画しています。特定の状況では、そのパスが消えて、これをアニメートしたいと思います。これをパスの「描画解除」と呼びましょう。

アニメーションの場合、CAShapeLayerを作成し、myPathを指定してから、CABasicAnimation(animationWithKeyPath:@ "strokeEnd")を設定します。

私の問題は、drawRectで描画されたものからアニメーションに切り替える方法です。drawRectから描画されたものからmyPathを削除し、setNeedsDisplayを呼び出す必要があります。そうしないと、アニメーションはdrawRectから描画されたパスによって非表示になります。

- (void)animationDidStart:(CAAnimation *)theAnimation
  {
    myPath = nil;
    [self setNeedsDisplay];
  }

しかし、このようにしてパスが表示され、パスがない状態ですばやくちらつきます。その後、パスはCoreAnimationによって再度レンダリングされ、うまく描画されません。

ちらつきを避けるためにもっとうまくできますか?

背景 これは私がアニメーションを設定する方法です:

- (void) startAnimation
{
  pathLayer.path = myPath.CGPath;
  pathLayer.hidden = false;

  CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
  pathAnimation.duration = 1; 
  pathAnimation.fromValue = [NSNumber numberWithFloat:1.0f];
  pathAnimation.toValue = [NSNumber numberWithFloat:0.0f];
  pathAnimation.fillMode = kCAFillModeForwards;
  pathAnimation.removedOnCompletion = NO;
  pathAnimation.delegate = self;
  [pathLayer addAnimation:pathAnimation forKey:@"strokeEnd"];
}
4

2 に答える 2

1

ちらつきの原因は、電話をかけたときに実行される暗黙のアニメーションだと思います

pathLayer.hidden = NO;

デフォルトでは、スタンドアロンCALayersはほとんどのプロパティ変更を暗黙的にアニメーション化します。drawRect:hiddenプロパティの暗黙的なアニメーションを無効にすると、(使用するかどうかに関係なくdrawLayer:inContext:)ちらつきなく実行されるはずです。

[CATransaction begin];
[CATransaction setDisableActions:YES];
pathLayer.hidden = NO;
[CATransaction commit];
于 2013-05-16T16:44:20.540 に答える
0

私の解決策は次のとおりです。UIKitsdrawRectをCAAnimationと組み合わせずに、代わりにCALayerに描画します。

- (void)drawLayer:(CALayer *)theLayer inContext:(CGContextRef)theContext 

これにより、描画からアニメーションへのちらつきのない切り替えが可能になります。

于 2013-05-14T13:46:04.843 に答える