在滚动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)