2009-03-03 17 views
70

Podczas przewijania strony UIScrollView (lub jej klasy pochodnej) wygląda na to, że wszystkie uruchomione NSTimers zostają wstrzymane do momentu zakończenia przewijania.UIScrollView zatrzymuje NSTimer, aż przewijanie się zakończy

Czy istnieje sposób na obejście tego? Wątki? Ustawienie priorytetu? Byle co?

+1

Rozważmy przyjmując [Kashif] (http://stackoverflow.com/users/211439/kashif-hisam) jest [odpowiedzi] (http: // stackoverflow.com/a/2742275/865175)! –

+0

Możliwy duplikat [Dlaczego funkcja UIScrollView wstrzymuje mój plik CADisplayLink?] (Http://stackoverflow.com/questions/12622800/why-does-uiscrollview-pause-my-cadisplaylink) – Fattie

+0

siedem lat później ... http: // stackoverflow .com/a/12625429/294884 – Fattie

Odpowiedz

183

Łatwym & prosty do wdrożenia rozwiązanie jest do zrobienia:

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
             target:... 
             selector:.... 
             userInfo:... 
             repeats:...]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+8

Mogę potwierdzić, że ta metoda działa. – Tyler

+1

UITrackingRunLoopMode to tryb - i jego public - można użyć do stworzenia różnych zachowań timera. –

+0

Uwielbiam to, działa jak urok z GLKViewController również. Po prostu ustaw kontroler.paused na YES, gdy pojawi się UIScrollView i uruchom własny zegar zgodnie z opisem. Odwróć go, gdy przewijany widok zostanie odrzucony i to wszystko! Pętla aktualizacji/renderowania nie jest zbyt kosztowna, więc może pomóc. –

5

Musisz uruchomić inny wątek i kolejną pętlę, jeśli chcesz, aby czasomierze były uruchamiane podczas przewijania; ponieważ liczniki czasu są przetwarzane jako część pętli zdarzeń, jeśli przetwarzanie jest zajęte procesem przetwarzania, nigdy nie pojawia się czasomierz. Chociaż kara za wydajność/baterię biegnących zegarów na innych wątkach może nie być warta zajmowania się tą sprawą.

+10

Nie wymaga innego wątku, zobacz bardziej aktualną [odpowiedź] (http://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes/2742275 # 2742275) z Kashif. Próbowałem go i działa bez dodatkowego wątku wymagane. – progrmr

+3

Nie ma potrzeby kolejnego wątku. Odpowiedź Kashifa jest znacznie lepsza. – stigi

+1

Dałem mu upvote –

8

Tak, Paul ma rację, jest to kwestia pętli uruchamiania. W szczególności, należy skorzystać z metody NSRunLoop:

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode 
7

Jest to szybka wersja.

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true) 
      NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
16

Dla każdego z użyciem Swift 3

timer = Timer.scheduledTimer(timeInterval: 0.1, 
          target: self, 
          selector: aSelector, 
          userInfo: nil, 
          repeats: true) 


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes) 
+0

Bardzo Ci dziękuję:) – IOSDev

Powiązane problemy