2014-02-19 18 views
12

Ich versuche einen Kreis zu zeichnen, der den Fortschritt anzeigt. Die Fortschrittsaktualisierungen könnten schnell kommen und ich möchte die Änderungen am Kreis animieren.Animiere einen CAShapeLayer, um einen Fortschrittskreis zu zeichnen

Ich habe versucht, dies mit den folgenden Methoden zu tun, aber nichts scheint zu funktionieren. Ist das möglich?

- (id)initWithFrame:(CGRect)frame strokeWidth:(CGFloat)strokeWidth insets:(UIEdgeInsets)insets 
{ 
    if (self = [super initWithFrame:frame]) 
    { 

     self.strokeWidth = strokeWidth; 

     CGPoint arcCenter = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
     CGFloat radius = CGRectGetMidX(self.bounds) - insets.top - insets.bottom; 

     self.circlePath = [UIBezierPath bezierPathWithArcCenter:arcCenter 
                 radius:radius 
                startAngle:M_PI 
                 endAngle:-M_PI 
                 clockwise:YES]; 
     [self addLayer]; 
    } 
    return self; 
} 


- (void)setProgress:(double)progress { 
    _progress = progress; 
    [self updateAnimations]; 
} 

- (void)addLayer { 

    CAShapeLayer *progressLayer = [CAShapeLayer layer]; 
    progressLayer.path = self.circlePath.CGPath; 
    progressLayer.strokeColor = [[UIColor whiteColor] CGColor]; 
    progressLayer.fillColor = [[UIColor clearColor] CGColor]; 
    progressLayer.lineWidth = self.strokeWidth; 
    progressLayer.strokeStart = 10.0f; 
    progressLayer.strokeEnd = 40.0f; 

    [self.layer addSublayer:progressLayer]; 
    self.currentProgressLayer = progressLayer; 

} 

- (void)updateAnimations{ 

    self.currentProgressLayer.strokeEnd = self.progress; 
    [self.currentProgressLayer didChangeValueForKey:@"endValue"]; 
} 

Derzeit dieser Code nicht einmal den Kreis nicht ziehen, aber der strokeStart und strokeEnd wird zieht den Kreis des progressLayer entfernen.

Wie kann ich es an einem bestimmten Punkt beginnen und beginnen, den Kreis basierend auf meiner Einstellung progress Eigenschaft zu zeichnen?

+7

Ich möchte keinen Code von Drittanbietern verwenden. Ich möchte verstehen, wie ich es selbst mache. –

+1

"Ich möchte keinen Code von Drittanbietern verwenden. Ich möchte es selbst verstehen." +1. Ich fühle das gleiche. – Unheilig

Antwort

6

Ich fand es heraus. Die strokeStart und strokeEnd Werte sind von 0,0 bis 1,0, also die Werte, die ich gab es waren viel zu hoch.

Also, ich meine Einstellung nur aktualisiert:

- (void)setProgress:(double)progress { 
    _progress = progress * 0.00460; 
    [self updateAnimations]; 
} 
1

Meine Antwort mit Beispiel here. Im Allgemeinen sollten Sie die Animation zu CAShapeLayer hinzufügen.