在iPhone上拖动UIScrollView时,OpenGL ES视图中的animation会冻结

我有一个animation透明OpenGL ES子视图(苹果模板EAGLView类的修改),它绘制一个旋转的球体。 就像苹果公司的例子一样,在可用的设备上使用CADisplayLink。

在同一个屏幕上,可以select一个包含UIButtons的UIScrollView。 当用户滚动UIScrollView,我的EAGLView的animation冻结。 此行为在iOS模拟器4.2和iPhone 2G上的iPhone OS 3.1.3上重现。

除了编码我自己的滚动视图之外,有什么办法可以防止EAGLView的暂停?

滚动期间CADisplayLink是否触发取决于将其添加到运行循环的模式。 也许你有这个地方:

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

UIApplication添加了一个运行循环模式, UITrackingRunLoopMode ,用于“在控件中跟踪”,其中包括滚动视图滚动的时间。 所以在这一点上runloop切换出默认模式,因此你的显示链接(以及任何定时器, NSURLConnections ,等,添加到默认模式)将失败,直到默认模式恢复。

快速修复:将您的代码更改为:

 [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 

UITrackingRunLoopMode被认为是常见的模式之一。

花费太多时间来中断UIKit可能导致一些控制响应非常差,所以你需要小心。 这将是大量的主题分歧,但虽然OpenGL的模式,因此不是特别的线程友好的,你可以使用EAGLSharegroup做一个单独的线程渲染,然后推到主线程。


(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 }