2009-03-03 21 views
70

Während ein UIScrollView (oder eine abgeleitete Klasse davon) scrollt, scheint es, als ob alle NSTimers, die ausgeführt werden, pausiert werden, bis der Bildlauf beendet ist.UIScrollView unterbricht NSTimer, bis der Bildlauf beendet

Gibt es eine Möglichkeit, dies zu umgehen? Themen? Eine Prioritätseinstellung? Etwas?

+1

Betrachten Annahme [Kashif] (http://stackoverflow.com/users/211439/kashif-hisam) 's [Antwort] (http: // stackoverflow.com/a/2742275/865175)! –

+0

Mögliches Duplikat von [Warum unterbricht UIScrollView mein CADisplayLink?] (Http://stackoverflow.com/questions/12622800/why-does-uiscrollview-pause-my-cadisplaylink) – Fattie

+0

sieben Jahre später ... http: // stackoverflow .com/a/12625429/294884 – Fattie

Antwort

183

Eine einfache & einfach zu implementierende Lösung ist zu tun:

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

Ich kann bestätigen, dass diese Methode funktioniert. – Tyler

+1

UITrackingRunLoopMode ist der Modus - und seine öffentliche - Sie können verwenden, um verschiedene Timer-Verhalten zu erstellen. –

+0

Liebe es, funktioniert auch mit GLKViewController wie ein Charme. Setzen Sie einfach controller.paused auf YES, wenn UIScrollView erscheint und starten Sie Ihren eigenen Timer wie beschrieben. Kehren Sie es um, wenn die Scrollview beendet wird und das ist es! Meine Update/Render-Schleife ist nicht sehr teuer, also könnte das helfen. –

5

Sie müssen einen anderen Thread und eine weitere Ausführungsschleife ausführen, wenn die Timer beim Scrollen ausgelöst werden sollen. Da Timer als Teil der Event-Schleife verarbeitet werden, kommen Sie nie zu den Timern, wenn Sie gerade damit beschäftigt sind, Ihre Ansicht zu scrollen. Auch wenn der Nachteil von Lauftimern bei anderen Threads in puncto/battery keinen Sinn macht, diesen Fall zu behandeln.

+10

Es erfordert keinen anderen Thread, siehe die neuere [Antwort] (http://stackoverflow.com/questions/605027/uiscrollview-pauses-ntimer-until-scrolling-finishes/2742275 # 2742275) aus Kashif. Ich habe es ausprobiert und es funktioniert ohne zusätzlichen Thread. – progrmr

+3

Keine Notwendigkeit für einen anderen Thread. Kashifs Antwort ist viel besser. – stigi

+1

Ich gab es eine Upvote –

8

Ja, Paul hat Recht, das ist ein Run-Loop-Problem. Insbesondere müssen Sie die Verwendung der NSRunLoop Methode machen:

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

Dies ist die schnelle Version.

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

Für jedermann mit Swift 3

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


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

Vielen Dank:) – IOSDev