Zaimplementowałam klasę LoadingLayer, która ma kilka elementów animujących (dokładnie 2), które są animowane przez CABasicAnimation
. Teraz ten widok ekranu ładowania pojawia się w całej aplikacji. Czy ukrycie widoku zatrzymuje wszystkie animacje? Albo pozwól mi powtórzyć: Czy jest dużo pamięci, o którą muszę się martwić, czy może to spowodować opóźnienia? Próbowałem użyć metod , ale spowodowały one pewne problemy z powodu wielowątkowości w mojej aplikacji. Czy w związku z tym dobrze jest ukrywać i wyświetlać ekran ładowania z ciągle pojawiającymi się animacjami?Przerwać i wznowić CABasicAnimation do ładowania ekranu?
Odpowiedz
https://developer.apple.com/library/content/qa/qa1673/_index.html
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
Jeśli widok jest ukryty (niewidoczny lub nie w interfejsie w ogóle), to nie jest część drzewa renderowania.
Ale dlaczego nie po prostu zatrzymać animację, gdy kontroler widoku, w którego widoku osadzona jest ta warstwa, opuszcza interfejs (viewDidDisappear
)? Po prostu powiedz warstwę do removeAllAnimations
. Następnie, jeśli chcesz, stwórz animację ponownie w viewWillAppear
?
Oto szybka wersja 3 z odpowiedzią Nico's.
Nadzieja pomaga!
fileprivate func pauseLayer(layer: CALayer) {
let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
fileprivate func resumeLayer(layer: CALayer) {
let pausedTime = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
layer.beginTime = timeSincePause
}
Rozszerzanie Nico „s odpowiedzi na modyfikację prędkości do każdej zmiennej:
extension CALayer {
func udpate(speed newSpeed: Float) {
let newSpeed = newSpeed == 0 ? 1e-6 : newSpeed
let triggerTime = self.convertTime(CACurrentMediaTime(), from: nil)
let offset = self.timeOffset
let begin = self.beginTime
let speed = self.speed
self.beginTime = (triggerTime - offset)/Double(speed) + begin
self.timeOffset = triggerTime
self.speed = newSpeed
}
}
użyć tego podejścia, jeśli jesteś gotów do zmiany prędkości animacji warstwy interaktywnie. Jeśli chcesz całkowicie wyłączyć warstwę, należy użyć odpowiedź Nico, chociaż przy użyciu tej metody z speed=0.0
rzeczywiście zajmuje około 11 dni dla animacje do końca, aw 1 godzinę animacji będzie postępu o 0.0036
- 1. Jak przerwać, wstrzymać i wznowić wątki w C#?
- 2. Programowo przerwać aktywny wygaszacz ekranu?
- 3. wyłączanie ekranu ładowania silverlight
- 4. Delegat CABasicAnimation do animacjiDidStop?
- 5. CABasicAnimation klucze
- 6. Jak wstrzymać i wznowić UIView.animateWithDuration
- 7. UIPercentDrivenInteractiveTransition Z CABasicAnimation
- 8. Jak zawiesić i wznowić sekwencję poleceń w Bash?
- 9. jak zatrzymać i wznowić NSTimer w iphone
- 10. Jak zatrzymać i wznowić TimerTask/Timer
- 11. Przerwać DO podczas pętli Java?
- 12. Czy wątki do ładowania i odczytu funkcji ładowania są bezpieczne?
- 13. Jak wstrzymać i wznowić licznik czasu?
- 14. Android: Jak zatrzymać i wznowić licznik odliczania?
- 15. Swing Timer, jak zatrzymać i wznowić?
- 16. Jak wznowić ekran (ekran GNU)
- 17. Nakładka ekranu do zrzutu ekranu
- 18. Przerwać wątek?
- 19. CABasicAnimation aktualny czas, który upłynął
- 20. przerwać listowych
- 21. otrzymywanie niejednoznacznego ekranu nieba podczas ładowania mapy google
- 22. CABasicAnimation nie działa z UIImageView
- 23. Rozmiary ekranu i gęstości ekranu Androida
- 24. Emberjs przerwać przejście i pokazać modalny
- 25. Problemy z opóźnieniem CABasicAnimation z IOS 5 i RemoteIO
- 26. Czy można wznowić kompresję 7zip?
- 27. Animacja 3D - CABasicAnimation i CATransform3D dając luka między widokami
- 28. jak przerwać obsługę KVM
- 29. Jak wznowić zatrzymane pojemnik Döcker
- 30. Jak przerwać żądanie pobrania?
miałem dość podobny wdrożenie, ale działa, dziękuję! –
Okay, nie, faktycznie miałem dokładnie taką samą implementację. Ale teraz wiem, dlaczego przestała działać od czasu do czasu. Za każdym razem, gdy aplikacja przechodzi w tło i ponownie ją uruchomię, animacje nie zostaną wznowione. Jakiś pomysł, co może być przyczyną tego? –
spróbuj wyczyścić animacje i wczytać je na didBeomceActive – Nico