美文网首页
UITableView滚动式NSTimer停止计数

UITableView滚动式NSTimer停止计数

作者: Masazumi柒 | 来源:发表于2017-07-05 16:49 被阅读0次

    现象:

    有一个页面,有tableview,然后button上是倒计时,倒计时用的NSTimer,当摁住tableview或者滚动的时候,计时就停止了。

    解决办法:

    将NSTimer实例添加到NSRunLoopCommonModes里

    //将timer添加到NSDefaultRunLoopMode中
    [NSTimer scheduledTimerWithTimeInterval:1.0
         target:self
         selector:@selector(timerTick:)
         userInfo:nil
         repeats:YES];
    //然后再添加到NSRunLoopCommonModes里
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0
         target:self
         selector:@selector(timerTick:)
         userInfo:nil
         repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    

    产生原因

    RunLoop只能运行在一种mode下,如果要换mode,当前的loop也需要停下重启成新的。利用这个机制,ScrollView滚动过程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode会切换到UITrackingRunLoopMode来保证ScrollView的流畅滑动:只能在NSDefaultRunLoopMode模式下处理的事件会影响ScrollView的滑动。
    如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。
    同时因为mode还是可定制的,所以:
    Timer计时会被scrollView的滑动影响的问题可以通过将timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)来解决。

    相关文章

      网友评论

          本文标题:UITableView滚动式NSTimer停止计数

          本文链接:https://www.haomeiwen.com/subject/olyqhxtx.html