我有一个简单的动画,使标签看起来像向上计数,我把它放在计时器中。
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];
});
答案 0 :(得分: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
}
答案 1 :(得分:1)
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
已将计时器添加到当前运行循环(由于您在后台队列上执行此循环,因此可能不是主运行循环)。
请改用timerWithTimeInterval:target:selector:userInfo:repeats:
。这会创建计时器,但不会将其添加到当前运行循环中。