2

パイを描画するための drawrect コードを含む UIView があります。

    - (void)drawRect:(CGRect)rect
    {
        CGRect parentViewBounds = self.bounds;
        CGFloat x = CGRectGetWidth(parentViewBounds)/2;
        CGFloat y = CGRectGetHeight(parentViewBounds)/2;

        // Get the graphics context and clear it
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextClearRect(ctx, rect);


        // define line width
        CGContextSetLineWidth(ctx, 4.0);


        CGContextSetFillColor(ctx, CGColorGetComponents( [someColor CGColor]));
        CGContextMoveToPoint(ctx, x, y);
        CGContextAddArc(ctx, x, y, 100,  radians(270), radians(270), 0); // 27
        CGContextClosePath(ctx);
        CGContextFillPath(ctx);
}

しかし、描画後に「endAngle」プロパティをアニメーション化しようとすると、機能しません。

CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@"endAngle"];
theAnimation.duration=1;
theAnimation.repeatCount=1;
theAnimation.autoreverses=NO;
theAnimation.fromValue=[NSNumber numberWithFloat:270];
theAnimation.toValue=[NSNumber numberWithFloat:60];
[[self.layer presentationLayer] addAnimation:theAnimation forKey:@"animateLayer"];

私はどこで間違いを犯していますか?

4

2 に答える 2

2

アニメーションを作成する場合は、描画に Core Animation を使用することを検討する必要があります。これにより、アニメーションがはるかに簡単になります。

Core Animation を使用してカスタムのアニメーション化可能な円グラフを作成する方法については、この素晴らしいチュートリアルをご覧ください。あなたが望むものを得るためにそれを変更できると確信しています。

複雑に思われる場合は、円の非常に広いストロークを作成して円グラフの形状を描く「円の一部を描く」に対する私の回答をご覧ください。

于 2012-10-08T19:58:04.807 に答える
1

いくつかのこと。そのような drawRect メソッドで行う描画をアニメーション化するために CAAnimation を使用することはできません。

第 2 に、CAShapeLayer を使用した場合、レイヤーにインストールされたパスへの変更をアニメーション化できますが、アニメーションのすべてのステップで、パスのコントロール ポイントの数とタイプが同じであることを確認する必要があります。

CGPath 円弧コマンドは、さまざまな数の制御点を使用してさまざまな角度を描画します。したがって、円弧の角度を変更してアニメートすることはできません。

あなたがしなければならないことは、弧の全長であるパスをインストールしてから、シェイプ レイヤーの strokeStart および/または strokeEnd プロパティへの変更をアニメーション化することです。これらのプロパティにより、パスは図面からパスの最初の部分/最後の部分を省略します。アニメーション化可能な円グラフで David がリンクしているチュートリアルでは、あえてその手法を使用しています。

于 2012-10-08T20:36:26.493 に答える