Das ist, glaube ich, die einfachere und bevorzugte Art und Weise, es zu tun:
UIBezierPath *newPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(newRadius, newRadius) radius:newRadius startAngle:(-M_PI/2) endAngle:(3*M_PI/2) clockwise:YES];
CABasicAnimation* pathAnim = [CABasicAnimation animationWithKeyPath:@"path"];
pathAnim.fromValue = (id)self.circle.path;
pathAnim.toValue = (id)newPath.CGPath;
pathAnim.duration = 2.0f;
[self.circle addAnimation:pathAnim forKey:@"animateRadius"];
self.circle.path = newPath.CGPath;
ich diesen Ansatz bekam von der Apple Documentation here (siehe Listing 02.03). Die wichtigen Dinge hier sind, dass Sie die setzen und auch den endgültigen Wert für self.circle
path
zu newPath.CGPath
direkt nach dem Einrichten der Animation festlegen. Eine Animation ändert den zugrunde liegenden Wert des Modells nicht. In der anderen Vorgehensweise ändern Sie also nicht permanent die path
Variable der Shape-Ebene.
Ich habe eine Lösung wie die gewählte Antwort in der Vergangenheit (mit removedOnCompletion
und fillMode
etc) verwendet, aber ich habe festgestellt, dass auf bestimmten Versionen von iOS Speicherverluste verursacht, und auch manchmal dieser Ansatz funktioniert einfach nicht für einige Grund.
Mit diesem Ansatz ist die Animation explizit zu schaffen (beide wo es beginnt und wo es endet), und Sie am Ende den endgültige bleibenden Wert für den Pfad angeben (mit der letzten Zeile) , so dass es keine Notwendigkeit gibt, sich damit zu befassen, die Animation nicht zu entfernen, wenn sie beendet ist (was meiner Meinung nach zu Speicherverlusten führt, wenn Sie diese Animation oft machen ... die nicht entfernten Animationen werden im Speicher aufgebaut).
Auch habe ich die Animation der bounds
entfernt, weil Sie es nicht brauchen, um den Kreis zu animieren. Auch wenn der Pfad außerhalb der Grenzen der Ebene gezeichnet wird, wird er immer noch vollständig angezeigt (Informationen hierzu finden Sie in der Dokumentation für CAShapeLayer
). Wenn Sie die Grenzen aus einem anderen Grund animieren müssen, können Sie denselben Ansatz verwenden (stellen Sie sicher, dass Sie den Wert und den Endwert für die Grenzen angeben).
Animiert es nicht, wenn Sie die Grenzen in einem Animationsblock ändern? – Lefteris
@ Jonathan Funktioniert meine Antwort nicht? –
@Lefteris Leider nicht. Ich mache es vielleicht falsch, aber der Kreis zeichnet nur neu. – Jonathan