2014-02-19 2 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"]; 
} 

В настоящее время этот код не даже нарисовать круг, но удаление strokeStart и strokeEnd нарисует полный круг в progressLayer в.

Как я могу заставить его начать с определенной точки и начать рисовать круг на основе меня, устанавливая свой progress?

+7

Я не хочу использовать сторонний код. Я хочу понять, как это сделать сам. –

+1

«Я не хочу использовать сторонний код. Я хочу понять, как это сделать сам». +1. Я чувствую то же самое. – Unheilig

ответ

6

Я понял. Значения strokeStart и strokeEnd составляют от 0,0 до 1,0, поэтому значения, которые я дал, были слишком высокими.

Итак, я просто обновил свою установку на:

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

Мой ответ с примером here. В общем, вы должны добавить анимацию в CAShapeLayer.