滚动UIScrollView时,我的自定义UI元素未更新

时间:2010-11-05 20:42:42

标签: iphone cocoa-touch

我有一个由NSTimer更新的旋转圆圈UI元素。我还有一个UIScrollView,可以在滚动时“阻止”旋转的圆圈。这是预期的,因为计时器和滚动视图都在同一个线程中。

所以我把计时器放在一个单独的线程中,基本上工作得很好!我可以看到它正常工作,因为即使在滚动时NSLog也会继续运行。

但我的问题是我的旋转圈仍在停止滚动!我怀疑重绘是否停止,直到主线程的运行循环(?)的下一次迭代。因此,即使它的角度一直在变化,它也可能不会重新绘制......

任何想法我能做什么?谢谢!

3 个答案:

答案 0 :(得分:42)

滚动时,主线程的运行循环位于UITrackingRunLoopMode。因此,您需要做的是在该模式下安排计时器(可能除默认模式外)。我相信NSRunLoopCommonModes包括默认和事件跟踪模式,所以你可以这样做:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.42 target:foo selector:@selector(doSomething) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

顺便说一下,你应该在主线程上完成所有这些操作。无需生成后台线程(除非每个定时器调用将进行一些冗长的处理)。

答案 1 :(得分:3)

UIScrollView不仅阻止NSTimers,它还会阻止整个主线程。并且UIKit对象只能在主线程上访问(并且,如果你试图避开这种限制,通常会以不可预测的方式进行限制),这可能就是为什么 - 即使你有一个来自外部线程的时钟 - 你'无法发布更新。

这有点躲闪,但有没有什么方法可以通过CoreAnimation实现你的动画?与此相关的事情继续有效,无论主线程中发生了什么。

答案 2 :(得分:0)

你是正确的UIScrollView在滚动期间不会更新其内容视图。

可能你最好的选择 - 这是一个黑客攻击 - 是单独显示你的动画视图(可能在一个框架视图中,以获得免费剪辑)并使用滚动视图委托回调来找出滚动的当前位置并相应地定位动画。

注意:此建议 a hack !这不是最佳实践,它肯定与简单,可维护的代码相反,没有副作用。但是,这是我能想到得到你想要的显示器的唯一方法。

另一种策略:重新考虑在滚动时显示滚动视图的动画内容的重要性。