2009-03-03 8 views
70

Mentre uno UIScrollView (o una classe derivata) sta scorrendo, sembra che tutti gli NSTimers in esecuzione vengano messi in pausa fino al termine dello scorrimento.UIScrollView mette in pausa NSTimer fino a quando lo scorrimento termina

C'è un modo per aggirare questo? Le discussioni? Un'impostazione prioritaria? Nulla?

+1

considerare di accettare [Kashif] (http://stackoverflow.com/users/211439/kashif-hisam) s '[risposta] (http: // stackoverflow.com/a/2742275/865175)! –

+0

Possibile duplicato (http://stackoverflow.com/questions/12622800/why-does-uiscrollview-pause-my-cadisplaylink) – Fattie

+0

sette anni dopo ... http [Perché UIScrollView mettere in pausa il mio CADisplayLink?]: // StackOverflow .com/a/12625429/294 mila ottocentoottantaquattro – Fattie

risposta

183

Un facile & semplice da implementare soluzione è quella di fare:

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

posso confermare che questo metodo funziona. – Tyler

+1

UITrackingRunLoopMode è la modalità - e il suo pubblico - che è possibile utilizzare per creare diversi comportamenti del timer. –

+0

Lo adoro, funziona come un fascino anche con GLKViewController. Basta impostare controller.paused su YES quando appare UIScrollView e avviare il proprio timer come descritto. Rovescia quando la scrollview è chiusa e questo è tutto! Il mio ciclo di aggiornamento/rendering non è molto costoso, quindi potrebbe essere d'aiuto. –

5

È necessario eseguire un altro thread e un altro ciclo di esecuzione se si desidera che i timer si attivino durante lo scorrimento; Dal momento che i timer vengono elaborati come parte del ciclo degli eventi, se sei impegnato a elaborare lo scorrimento della vista, non vai mai ai timer. Anche se la penalità perf/battery dei timer in esecuzione su altri thread potrebbe non valere la pena gestire questo caso.

+10

non necessita di un altro thread, vedere la più recente [risposta] (http://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes/2742275 # 2742275) di Kashif. L'ho provato e funziona senza thread aggiuntivi richiesti. – progrmr

+3

Non c'è bisogno di un'altra discussione. La risposta di Kashif è di gran lunga migliore. – stigi

+1

ho dato un upvote –

8

Sì, Paul ha ragione, questo è un problema del ciclo di esecuzione. In particolare, è necessario fare uso del metodo NSRunLoop:

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

Questa è la versione veloce.

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

per chiunque utilizzi Swift 3

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


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

Grazie mille:) – IOSDev