UIScrollView在滚动时暂停NSTimer

时间:2011-08-14 20:02:06

标签: ios xcode uiscrollview nstimer

我有一个UIScrollView,它有一系列快速更新数字的标签(每隔0.06秒)。但是,当滚动视图移动时,NSTimer会暂停,直到滚动和弹性动画结束后才会继续。

无论滚动视图的状态如何,如何避免这种情况并让NSTimer运行?

3 个答案:

答案 0 :(得分:24)

解决此问题的一种简单方法是将NSTimer添加到mainRunLoop

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

要从安装它的所有运行循环模式中删除计时器,请向计时器发送invalidate消息。

答案 1 :(得分:1)

对于swift:

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

答案 2 :(得分:0)

Swift )另一种选择:你可以使用像这样的基于GCD的计时器系统:

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;
        }
    }
}