7
votes

UiscrollView pause Nstimer lors du défilement

J'ai un uiscrollview qui dispose d'une série d'étiquettes qui mettent en jour des numéros de mise à jour rapide (toutes les années 06 secondes). Bien que la vue de défilement se déplace, cependant, le nstimer est en pause et ne continue pas avant la fin du défilement et l'animation élastique a fini.

Comment puis-je éviter cela et avoir le NSTIMER exécuter quel que soit l'état de la vue de défilement?


0 commentaires

3 Réponses :


25
votes

Un moyen facile de résoudre ce problème est d'ajouter votre Nstimer au MainRunloop . xxx

Pour supprimer une minuterie de toutes les boucles d'exécution Modes sur lesquels il est installé, envoyez un message invalidez à la minuterie.


2 commentaires

Donc, avec cela, je n'ai pas vraiment à déclencher la minuterie, il est initié lorsque cette ligne est exécutée, correcte?


À partir de la documentation: "Vous pouvez ajouter une minuterie à plusieurs modes d'entrée. Lors de l'exécution en mode désigné, le récepteur provoque le déclenchement de la minuterie ou après sa date d'incendie planifiée. Lors du tir, la minuterie invoque sa routine de manutention associée, qui est un sélecteur sur un objet désigné. "



0
votes

( Swift STRT>) Une alternative: vous pouvez utiliser un système de minuterie basé sur GCD comme celui-ci:

class GCDTimer {

    private var _timer : dispatch_source_t?

    init() {

    }

    private func _createTheTimer(interval : Double, queue : dispatch_queue_t, block : (() -> Void)) -> dispatch_source_t
    {
        let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        if (timer != nil)
        {
            dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC))), UInt64(interval * Double(NSEC_PER_SEC)), (1 * NSEC_PER_SEC) / 10);
            dispatch_source_set_event_handler(timer, block);
            dispatch_resume(timer);
        }
        return timer;
    }


    func start(interval : Double, block : (() -> Void))
    {
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        _timer = _createTheTimer(interval, queue: queue, block: block)

    }

    func stop()
    {
        if (_timer != nil) {
            dispatch_source_cancel(_timer!);
            _timer = nil;
        }
    }
}


3 commentaires

Voici comment vous l'utiliseriez: var myInterval: gcdtimer = gcdtimer () myInval.start (1.0) {println ("lol")}


Si vous souhaitez effectuer une mise à jour d'un élément UI à l'aide de cette minuterie, vous devez le faire sur le fil principal, comme celui-ci: Dispatch_Async (DisPatch_Get_Main_Quue (), {Self.MyuIImageView.Image = UIIMAGE (Données: Données comme! Nsdata)!})


Content que vous ayez trouvé ça utile!



1
votes

Pour SWIFT:

NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)


0 commentaires