为什么UIScrollView暂停我的CADisplayLink?

我有一个CAEAGLLayer支持的视图,它位于UIScrollView中。 当我开始滚动时,调用openGL视图的-draw方法的CADisplayLink停止调用。

我validation了我的runloop启动/停止方法不会在滚动时被调用。 一旦滚动开始,-draw方法就不会被调用,并且只要滚动结束,就会继续调用。

滚动开始后,UIKit是否立即停止CADisplayLink?

显示链接被添加到运行循环中,如下所示:

[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

也许这与运行循环模式和UIScrollView有冲突? 是否有其他运行循环模式或替代解决scheme来保持CADisplayLink触发,即使UIScrollView正在滚动?

我以为在任何应用程序中都可以有不止一个CADisplayLink。 这是错的吗?

滚动UIScrollView ,您不在NSDefaultRunLoopMode ; 你在UITrackingRunLoopMode 。 所以只有前者的计时器才会在后者中启动。 您可以通过重复调用addToRunLoop:forMode:将您的CADisplayLink添加到多个运行循环模式,或者使用覆盖两种模式的NSRunLoopCommonModes调用它。

他们在会议223的WWDC2012:“使用滚动视图增强用户体验”中详细讨论了这个问题以及将滚动视图与GL集成的其他问题。 我build议观看video ,因为那里有很多其他东西可能与您的情况有关。


(2016)Swift3中的一个例子…

 let d = CADisplayLink(target: self, selector: #selector(ThisClassName.updateAlpha)) d.add(to: RunLoop.current, forMode: RunLoopMode.commonModes) //and then, for example... func updateAlpha() { let a = leader.layer.presentation()?.value(forKey: "opacity") as! CGFloat follower.alpha = a }