我有一个动画透明 OpenGL ES 子视图(Apple 模板 EAGLView 类的修改),它绘制一个旋转球体。就像 Apple 的示例一样,CADisplayLink 用于可用的设备。
在同一屏幕上,有一个包含可以选择的 UIButtons 的 UIScrollView。当用户滚动 UIScrollView 时,我的 EAGLView 的动画冻结。此行为在 iOS Simulator 4.2 和 iPhone 2G 设备上的 iPhone OS 3.1.3 上重现。
除了编写我自己的滚动视图之外,还有什么想法可以防止 EAGLView 暂停?
Whether CADisplayLink
滚动期间触发取决于将其添加到运行循环的模式。也许你在某个地方有这个:
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
UIApplication添加了runloop模式,UITrackingRunLoopMode
,用于“控件中的跟踪”,其中包括滚动视图何时滚动。因此,此时运行循环将退出默认模式,因此您的显示链接(以及任何计时器,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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)