在滚动UIScrollView期间UILabel更新停止

我有一个scrollView与imageView里面。 scrollView是superView的子视图,而imageView是scrollView的子scrollView 。 我还有一个标签(在超级视图级别),每毫秒从NSTimer接收文本属性的更新值。

问题是:在滚动期间,标签停止显示更新。 当滚动结束时,标签上的更新重新开始。 当更新重新启动它们是正确的; 这意味着label.text值按预期更新,但在滚动时,更新显示会在某处被覆盖。 不pipe是否滚动,我都想在标签上显示更新。

以下是如何实现标签更新:

 - (void)startElapsedTimeTimer { [self setStartTime:CFAbsoluteTimeGetCurrent()]; NSTimer *elapsedTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(updateElapsedTimeLabel) repeats:YES]; } - (void)updateElapsedTimeLabel { CFTimeInterval currentTime = CFAbsoluteTimeGetCurrent(); float theTime = currentTime - startTime; elapsedTimeLabel.text = [NSString stringWithFormat:@"%1.2f sec.", theTime]; } 

感谢您的帮助。

我最近有同样的麻烦,并在这里find了解决scheme: 我的自定义UI元素…。

简而言之:当您的UIScrollView滚动时,NSTimer不会更新,因为运行循环以不同的模式运行(NSRunLoopCommonModes,用于跟踪事件的模式)。

解决scheme是在创build之后将您的计时器添加到NSRunLoopModes中:

 NSTimer *elapsedTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(updateElapsedTimeLabel) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:elapsedTimeTimer forMode:NSRunLoopCommonModes]; 

(代码来自上面链接的post)。

sunkehappy在Swift 2中的解决scheme:

 self.updateTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "updateFunction", userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(self.updateTimer, forMode: NSRunLoopCommonModes) 

我已经看到与滚动UIScrollView相结合的类似的行为。 可能发生的情况是,滚动操作完全阻止了主运行循环 ,该循环负责与视图更新相关的任何事情。 你在这里没有做任何错误,更新视图层次结构应该由主循环来处理,所以你不能把你的UILabel更新到后台线程(尽pipe我可能仍然会尝试看看会发生什么)。

我并没有真正研究过这个问题,但是我认为你对此没有什么可以做的。 我会高兴地接受certificate我错的答案!

在Swift 3.x中的解决scheme:

 self.updateTimer = Timer.scheduledTimer(timeInterval:1.0, target: self, selector: "updateFunction", userInfo: nil, repeats: true) RunLoop.current.add(self.updateTimer, forMode: RunLoopMode.commonModes)