Ich habe eine Reihe von Bögen, alle mit Code wie folgt erstellt und animiert mit CABasicAnimation @ "StrokeEnd".Animieren einer benutzerdefinierten CAShapeLayer mit einer variablen Rate
if (!_fourthShapeLayer) {
_fourthPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(rect.size.width/2, rect.size.height/2)
radius:rect.size.width/2 - 9.5
startAngle:startAngle
endAngle:startAngle - (endAngle - startAngle)
clockwise:YES];
_fourthShapeLayer = [CAShapeLayer layer];
_fourthShapeLayer.path = _fourthPath.CGPath;
_fourthShapeLayer.fillColor = [UIColor clearColor].CGColor;
_fourthShapeLayer.strokeColor = [UIColor colorWithHue:.33888889 saturation:.62 brightness:0.62 alpha:1.0].CGColor;
_fourthShapeLayer.lineWidth = 3.0;
_fourthShapeLayer.rasterizationScale = 2.0 * [UIScreen mainScreen].scale;
_fourthShapeLayer.shouldRasterize = YES;
}
CABasicAnimation *strokeAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
strokeAnimation.fromValue = [NSNumber numberWithFloat:0.0];
strokeAnimation.toValue = [NSNumber numberWithFloat:1.0];
strokeAnimation.duration = 1.0;
strokeAnimation.speed = 1.0;
[_fourthShapeLayer addAnimation:strokeAnimation forKey:@"stroke"];
[self.layer addSublayer:_fourthShapeLayer];
Was variiert, ist die Farbe und der Radius beim Definieren des Pfades.
Ich möchte die Geschwindigkeit der Bögen Animationen ändern, um Folgendes zu tun: alle starten und enden zur gleichen Zeit, haben aber unterschiedliche Raten. Im Grunde beginnen einige Bögen schnell und enden langsam, die anderen beginnen langsam und enden schnell - alle mit unterschiedlichen Geschwindigkeiten.
Es wäre großartig, wenn ich die Menge des Bogens wie folgt definieren könnte: pow ((elapsedAnimationTime/totalAnimationTime), 1.05) - Variieren der 'Power' (1.05, 1.02, .97, .91 für die verschiedenen Bögen , zum Beispiel).
Hat jemand irgendwelche Vorschläge? Ursprünglich habe ich einen Timer gesetzt und drawRect aufgerufen: jede Hundertstelsekunde, die die Pfadendpunkte nach der oben erwähnten "Power" -Funktion definiert - aber das war natürlich eine zu teure Operation.
Hilfe geschätzt!
By the way, wenn Sie den Timer-basierten Ansatz in der Zukunft (für einige Animationen zu tun, es ist der beste Weg dies zu tun), es ist besser, 'CADisplayLink' zu verwenden, das automatisch mit Bildschirmaktualisierungen koordiniert wird. – Rob
@Rob Super Vorschlag. Vielen Dank. – ArthurVonBabylon
Während die Verwendung von CABasicAnimation und die Änderung der Eigenschaft timingFunction (die Antwort von Alex, siehe unten) am effizientesten für die CPU war, führte dies zu einem kniffligen Verhalten, einschließlich der kurz nach Beendigung der Animation verschwundenen Bögen. Der CADisplayLink erwies sich in diesem Fall als bessere Lösung, da er eine optimale Kontrolle ohne merkwürdiges Verhalten bot. – ArthurVonBabylon