我有一个由 CAEAGLLayer 支持的 View ,它位于 UIScrollView 中。当我开始滚动时,调用 openGL View 的 -draw 方法的 CADisplayLink 停止调用。
我确认我的 runloop 启动/停止方法在滚动时不会被调用。 -draw 方法不会在滚动开始时立即调用,而是在滚动结束后立即恢复调用。
UIKit 是否会在滚动开始时立即阻止 CADisplayLink 触发?
显示链接是这样添加到run loop中的:
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
可能是这个run loop模式和UIScrollView有冲突?即使在 UIScrollView 滚动时,是否还有其他运行循环模式或替代解决方案来保持 CADisplayLink 触发?
我认为在任何应用程序中可以有不止一个 CADisplayLink。错了吗?
最佳答案
在滚动 UIScrollView
时,您不在 NSDefaultRunLoopMode
中;你在 UITrackingRunLoopMode
。所以任何只为前者安排的计时器都不会在后者触发。您可以通过重复调用 addToRunLoop:forMode:
将您的 CADisplayLink
添加到多个运行循环模式,或者使用涵盖两种模式的 NSRunLoopCommonModes
调用一次.
他们在 WWDC 2012 的第 223 场 session 上详细讨论了这一点,以及将 ScrollView 与 GL 集成的其他问题:“使用 ScrollView 增强用户体验”;我建议观看 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
}
关于ios - 为什么 UIScrollView 会暂停我的 CADisplayLink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622800/