Question

Lorsqu'un UIScrollView (ou une classe dérivée de celui-ci) défile, il semble que tous les NSTimers en cours d'exécution soient mis en pause jusqu'à la fin du défilement.

Y at-il un moyen de contourner cela? Des fils? Un paramètre prioritaire? Quelque chose?

Était-ce utile?

La solution

Un facile & amp; simple à mettre en œuvre la solution est de faire:

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

Autres conseils

Pour ceux qui utilisent Swift 3

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


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

Oui, Paul a raison, il s’agit d’un problème de boucle d’exécution. Plus précisément, vous devez utiliser la méthode NSRunLoop:

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

Ceci est la version rapide.

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

Vous devez exécuter un autre thread et une autre boucle d’exécution si vous voulez que les minuteries se déclenchent lors du défilement; comme les minuteries sont traitées dans le cadre de la boucle d’événements, si vous êtes occupé à faire défiler votre vue, vous n’allez jamais aux minuteries. Bien que la pénalité de perforation / batterie d’exécuter des minuteries sur d’autres threads puisse ne pas valoir la peine d’être traitée dans ce cas.

pour tous ceux qui utilisent Swift 4:

    timer = Timer(timeInterval: 1, target: self, selector: #selector(timerUpdated), userInfo: nil, repeats: true)
    RunLoop.main.add(timer, forMode: .common)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top