2010-09-16 69 views
1

我有两个子视图的根部的UIView:如何在用户滚动UIScrollView时让我的UIView重绘?

  1. 定制UIView子类
  2. 一个UIScrollView

定制UIView子类具有一定的状态是由一个NSTimer一个触发间隔N秒更新。当视图的状态更新时,视图调用[self setNeedsDisplay],此后不久触发重绘。这一切都按预期工作。

但是,无论何时用户滚动UIScrollView,自定义UIView子类都不会重绘。用户触摸UIScrollView时,重画会停止。然后,当用户停止触摸UIScrollView并且滚动完全停止时,最终重新定制自定义UIView子类。

有没有办法让用户在滚动UIScrollView时自定义UIView子类重绘?

+0

可能重复的[UIScrollView暂停NSTimer直到滚动完成](http://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes) – 2010-09-16 18:33:22

回答

1

我更在Mac上的一面,但我想,既然-setNeedsDisplay:标志为未来重绘,它永远不会发生,因为滚动/触摸事件仍然占用当前(主)循环。在这种情况下,您的计时器永远不会有机会触发主循环,因为滚动尚未完成。

修正

快速搜索发现将您的计时器与NSRunLoopCommonModes运行循环防止它们被暂停。这可能会为你解决问题,但你仍然可能会为“未来展示”而不是“现在绘制”而发生冲突。

另外除了

啊。好像this has already been answered on SO

+0

谢谢!我不认为NSTimer是罪魁祸首,所以我甚至没有想过要搜索UIScrollView/NSTimer。 – 2010-09-16 19:37:46

+0

这并不是建议定时器,运行循环和UI(噢,我的!)不会让我头痛,但对他们如何交互至少有一个微妙的把握是绝对有益的。它至少可以让你找到出发点,以便发现你的行为有多糟糕。 :-) – 2010-09-16 20:11:38

+0

是的,我刚读完Run Loops文档(http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html)。非常丰富。 – 2010-09-16 20:31:23

相关问题