To jest, moim zdaniem, prostsze i preferowany sposób to zrobić:
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;
mam takie podejście z Apple Documentation here (patrz Listing 3-2). Ważne jest, aby ustawić fromValue
i ustawić końcową wartość dla self.circle
z path
na newPath.CGPath
zaraz po ustawieniu animacji. Animacja nie zmienia podstawowej wartości modelu, więc w innym podejściu nie wprowadzasz trwałej zmiany w zmiennej path
warstwy kształtu.
Użyłem rozwiązania takiego jak wybrana odpowiedź w przeszłości (używając removedOnCompletion
i fillMode
itp.), Ale odkryłem, że w niektórych wersjach iOS powodowały wycieki pamięci, a także czasami takie podejście po prostu nie działa dla niektórych powód.
Dzięki takiemu podejściu tworzysz animację jawnie (zarówno od miejsca, w którym zaczyna się i gdzie się kończy), i określasz końcową stałą wartość ścieżki na końcu (z tą ostatnią linią) , więc nie ma potrzeby zadzieraj z usunięciem animacji po jej zakończeniu (co, jak uważam, prowadzi do przecieków pamięci, jeśli wykonujesz tę animację wiele razy ... nieusunięte animacje gromadzą się w pamięci).
Usunąłem również animację z bounds
, ponieważ nie jest ona potrzebna do animowania okręgu. Nawet jeśli ścieżka zostanie narysowana poza granicami warstwy, nadal będzie w pełni widoczna (zobacz dokumentację na ten temat w dokumencie CAShapeLayer
). Jeśli potrzebujesz animować granice z jakiegoś innego powodu, możesz użyć tego samego podejścia (upewnij się, że podałeś fromValue
i ostateczną wartość dla granic).
Czy to nie jest animacja, jeśli modyfikujesz granice w bloku animacji? – Lefteris
@ Jonathan Czy moja odpowiedź nie działa? –
@Lefteris Niestety nie. Być może robię to źle, ale krąg po prostu przerysowuje. – Jonathan