2014-02-19 88 views
12

我想繪製一個將用於指示進度的圓圈。進度更新可能會很快進行,並且我想要對圈子的更改進行動畫製作。使CAShapeLayer動畫繪製進度圈

我試着用下面的方法做這件事,但似乎沒有任何工作。這可能嗎?

- (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"]; 
} 

目前該代碼甚至不畫了圈,但在取出progressLayer的strokeStartstrokeEnd將繪製完整的圓。

我怎樣才能讓它開始在某一點,並開始繪製基於我設置我的progress屬性的圈子?

+7

我不想使用第三方代碼。我想了解如何自己做。 –

+1

「我不想使用第三方代碼,我想了解如何自己做。」 +1。我也是這麼感覺的。 – Unheilig

回答

6

我想通了。 strokeStartstrokeEnd的值從0.0到1.0,所以我給它的值太高了。

所以,我剛剛更新了我的設置:

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

我與例如here答案。一般來說,您應該將動畫添加到CAShapeLayer