ios7 - 可以在兩個方向上動畫的動畫餅圖



uiview core-animation (1)

我正在嘗試構建一個動畫餅圖,根據其progress的值是增加還是減少,可以在兩個方向上對餅圖進行動畫製作。 我已經從這裡提供的示例代碼開始,並按照此處的建議進行了一些調整。

麻煩的是後台動畫還沒有完全正常工作。 它只是部分清除了派。 我不太確定這是否是由於我錯誤地使用動畫或計算坐標不正確,因為如果我插入CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor); 進入第一個分支並將混合模式更改為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];
}

你發布的答案中的代碼( 動畫CAShapeLayer派 )對我來說工作正常,甚至使用clearColor :看到這個視頻
clearColor不會產生正確行為的唯一情況是背景顏色固定且前景清晰的情況:在這種情況下,需要更改混合模式,正如您在代碼中指出的那樣。

我嘗試了這三種配置,並且在所有情況下,圖層都正確地響應了-setProgress:

  • DZRoundProgressView作為主UIView子視圖;
  • 主視圖類設置為DZRoundProgressView ;
  • DZRoundProgressView作為主UIView子圖層;

而且,在前一幀中的圖層內容不太可能在下一次繪製調用時仍然可見:顯然, -drawInContext:的默認行為是在執行前清除上下文,就像這個問題所說的那樣。
如果你沒有使用圖層的contents屬性,而且你沒有盜用繪圖管道,那麼self.progress的值可能會出錯。 或許是表現層和模型層的一些問題,或者是屬性的實現。

事實上,這並不能解決你的問題,因為我無法複製或隔離它,但應該允許你解決它。





blending