0

我有一个简单的动画来使标签看起来像它的向上计数,我把它放在一个计时器中。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(animateScore:) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

动画分数选择器递增标签文本,直到达到所需的整数,然后使计时器无效。

现在,它在其他 UI 工作(例如重新加载表格视图部分)时停止。

我尝试运行此代码,但没有成功:

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:weakSelf selector:@selector(animateScore:) userInfo:nil repeats:YES];

      [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
     }); 
4

2 回答 2

2

执行此操作的首选方法是使用特殊的计时器类 CADisplayLink,它会在每次更新设备屏幕时触发。就像是:

@property (nonatomic, strong) CADisplayLink *displayLink;

-(void)viewDidLoad {
    // …
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkDidFire:)];
    [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    // …
}

-(void)displayLinkDidFire:(CADisplayLink *)displayLink {
    // Update label text
}
于 2013-09-14T19:32:02.850 回答
1

scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:已经将计时器添加到当前运行循环(它可能不是主运行循环,因为您在后台队列上执行它)。改为使用timerWithTimeInterval:target:selector:userInfo:repeats:。这会创建计时器,但不会将其添加到当前运行循环中。

于 2013-09-14T18:31:48.800 回答