ios7 - ツール - 両方向にアニメートできるアニメーション円グラフ



グラフ アニメーション js (1)

投稿した回答のコード( アニメーションされたCAShapeLayer pie )は、私のために両方向でうまく動作します( clearColorを使用しても): この動画をご覧ください。
clearColorが正しい動作をしない唯一の状況は、背景色がclearColorで、前景が透明な場合です。その場合、コードで指摘したように、ブレンドモードの変更が必要です。

私はこれらの3つの設定を試してみましたが、すべてのケースでレイヤーが-setProgress:正しく応答してい-setProgress:

  • メインUIViewサブビューとしてのDZRoundProgressView
  • DZRoundProgressView設定されたメインビューのクラス。
  • メインUIViewサブレイヤとしてのDZRoundProgressView

さらに、前のフレームのレイヤの内容が次の描画呼び出しでまだ見えないようです。明らかに、 -drawInContext:デフォルトの動作は、実行前にコンテキストをクリアすることです。
レイヤーのcontentsプロパティーで作業しておらず、描画パイプをハッキングしていない場合は、 self.progressの値に問題がある可能性があります。 プレゼンテーションレイヤーとモデルレイヤーの問題、またはプロパティーの実装に問題がある可能性があります。

確かにこれはあなたの問題を解決するものではありません。なぜなら私はそれを再現することもそれを分離することもできないからです。

私は進行方向の値が増減するかどうかによって、パイを両方向にアニメートできるアニメーションの円グラフを作成しようとしています。 私はここで提供されたサンプルコードから始め、 ここで示唆されているようにいくつかの調整を行いました

問題は、バックアニメーションがまだまだ機能していないことです。 それは部分的にのみパイをクリアします。 CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor);を挿入すると、これが私がアニメーションを誤って使用しているか、座標を正しく計算していないことが原因であるかどうかはCGContextSetFillColorWithColor(context, UIColor.redColor.CGColor); 最初のifブランチに変更し、ブレンドモードをkCGBlendModeNormal変更すると、結果も同様にオフになります。

だからここに私の現在のコード( PieLayer.mから抜粋) - 誰が改善を提案することができますか?

- (void)drawInContext:(CGContextRef)context {
    PieView *pieView = self.delegate;
    NSAssert(pieView != nil, nil);

    CGRect rect = CGRectInset(self.bounds, 1, 1);

    CGFloat radius = MIN(CGRectGetMidX(rect), CGRectGetMidY(rect));
    CGPoint center = CGPointMake(radius, CGRectGetMidY(rect));

    CGContextSetFillColorWithColor(context, UIColor.clearColor.CGColor);
    CGContextSetStrokeColorWithColor(context, pieView.circumferenceTintColor.CGColor);
    CGContextSetLineWidth(context, 2.0f);

    CGContextFillEllipseInRect(context, rect);
    CGContextStrokeEllipseInRect(context, rect);

    CGFloat startAngle   = -M_PI / 2;
    CGFloat endAngle     = self.progress     * 2 * M_PI + startAngle;
    CGFloat lastEndAngle = self.lastProgress * 2 * M_PI + startAngle;

    if (self.lastProgress > self.progress) {
        NSLog(@"clear sector between progress=%f and lastProgress=%f", self.progress, self.lastProgress);

        CGContextMoveToPoint(context, center.x, center.y);
        CGContextAddArc(context, center.x, center.y, radius, endAngle, lastEndAngle, 0);
        CGContextClosePath(context);

        CGContextSetBlendMode(context, kCGBlendModeClear);
        CGContextFillPath(context);
    }

    if (self.progress > 0) {
        NSLog(@"draw sector to progress=%f (lastProgress=%f)", self.progress, self.lastProgress);

        CGContextSetFillColorWithColor(context, pieView.sectorTintColor.CGColor);

        CGContextMoveToPoint(context, center.x, center.y);
        CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0);
        CGContextClosePath(context);

        CGContextSetBlendMode(context, kCGBlendModeNormal);
        CGContextFillPath(context);
    }

    ((PieLayer *)self.modelLayer).lastProgress = self.progress;

    [super drawInContext:context];
}




blending