我想實現一個圓形的進度,並且可以動態設置進度值。代碼如下:CAShapeLayer動畫在我設置的時間非常短時閃動
- (CGPoint)center {
return CGPointMake(self.view.frame.origin.x + self.view.frame.size.width/2.0,
self.view.frame.origin.y + self.view.frame.size.height/2.0);
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
CGMutablePathRef roundPath = CGPathCreateMutable();
CGPathAddArc(roundPath, NULL, self.center.x, self.center.y,
20,
2 * M_PI + M_PI_2,
M_PI_2,
YES);
CAShapeLayer *backgroundLayer = [CAShapeLayer layer];
backgroundLayer.frame = self.view.layer.bounds;
backgroundLayer.path = roundPath;
backgroundLayer.strokeColor = [[NSColor blueColor] CGColor];
backgroundLayer.fillColor = nil;
backgroundLayer.lineWidth = 10.0f;
backgroundLayer.lineJoin = kCALineJoinBevel;
[self.view.layer addSublayer:backgroundLayer];
CAShapeLayer *pathLayer = [CAShapeLayer layer];
pathLayer.frame = self.view.layer.bounds;
pathLayer.path = roundPath;
pathLayer.strokeColor = [[NSColor whiteColor] CGColor];
pathLayer.fillColor = nil;
pathLayer.lineWidth = 10.0f;
pathLayer.lineJoin = kCALineJoinBevel;
[self.view.layer addSublayer:pathLayer];
self.pathLayer = pathLayer;
[self start];
}
- (void)start {
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = 0.01;
pathAnimation.fromValue = [NSNumber numberWithFloat:self.progress];
pathAnimation.toValue = [NSNumber numberWithFloat:self.progress+0.01];
[self.pathLayer setStrokeEnd:self.progress + 0.01];
[pathAnimation setDelegate:self];
[self.pathLayer addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
self.progress += 0.01;
if (self.progress < 1.0) {
[self start];
}
}
我發現,當我設定的時間是0.1F或更大,它會工作right.But如果我設定的時間是0.01F,動畫將不會從正確的值開始,它會從更大的值開始動畫,然後降低到正確的值。所以整個動畫總是閃爍,任何人都有同樣的問題或知道爲什麼?非常感謝!
一個非常好的點(+1)......不能相信我錯過了一些顯而易見的原因!我想我認爲OP有一個使用重複動畫的奇妙理由......我唯一能想到的就是能夠暫停動畫 - 但如果OP需要的話,可以只使用一個顯式動畫。 – Hamish
真的非常感謝您的幫助,您爲我節省了很多時間。 – melody5417
感謝您的幫助,我只知道我應該點擊檢查標記接受的答案。 – melody5417